7.2 序列化与反序列化
概述
序列化是将对象转换为可存储或传输的格式(如字节流、JSON、XML等)的过程,反序列化则是将序列化后的数据重新转换为对象的过程。在C#中,序列化与反序列化广泛应用于数据持久化、网络通信和跨平台数据交换等场景。
7.2.1 序列化的基本概念
核心作用
- 持久化存储:将对象状态保存到文件或数据库中。
- 跨进程/网络传输:通过序列化实现对象在网络中的传输(如Web API)。
- 深拷贝:通过序列化与反序列化实现对象的深度复制。
常见序列化格式
| 格式 | 特点 |
|---|---|
| JSON | 轻量级、易读、跨平台,广泛用于Web开发。 |
| XML | 结构化、支持复杂数据类型,但冗余较多。 |
| Binary | 高效、体积小,但不可读且依赖特定平台(如.NET)。 |
7.2.2 C#中的序列化实现
1. JSON序列化(推荐)
使用 System.Text.Json(.NET Core 3.0+)或 Newtonsoft.Json(第三方库):
using System.Text.Json;
// 序列化
var person = new { Name = "Alice", Age = 30 };
string json = JsonSerializer.Serialize(person);
// 反序列化
var deserializedPerson = JsonSerializer.Deserialize<Person>(json);
2. XML序列化
通过 System.Xml.Serialization:
using System.Xml.Serialization;
using System.IO;
// 序列化
var serializer = new XmlSerializer(typeof(Person));
using (var writer = new StringWriter())
{
serializer.Serialize(writer, person);
string xml = writer.ToString();
}
// 反序列化
using (var reader = new StringReader(xml))
{
var result = (Person)serializer.Deserialize(reader);
}
3. 二进制序列化
需标记类为 [Serializable](仅限.NET Framework):
[Serializable]
public class Person { /*...*/ }
// 使用 BinaryFormatter(注意:.NET 5+已标记为不安全,建议替代方案)
7.2.3 高级场景与注意事项
自定义序列化行为
- JSON:通过
[JsonPropertyName]或JsonSerializerOptions控制属性名称和忽略字段。 - XML:使用
[XmlAttribute]、[XmlIgnore]等特性定制输出。
性能优化
- 预编译序列化器:在ASP.NET Core中预编译JSON序列化器以提高性能。
- 流式处理:对大文件使用
Utf8JsonReader/Utf8JsonWriter避免内存溢出。
安全风险
- 反序列化攻击:避免反序列化不可信数据(如
BinaryFormatter易受攻击)。 - 推荐方案:优先使用JSON或XML并验证输入数据。
7.2.4 实战示例:配置文件读写
// 读取JSON配置文件
public static T LoadConfig<T>(string filePath)
{
string json = File.ReadAllText(filePath);
return JsonSerializer.Deserialize<T>(json);
}
// 保存配置
public static void SaveConfig<T>(T config, string filePath)
{
var options = new JsonSerializerOptions { WriteIndented = true };
string json = JsonSerializer.Serialize(config, options);
File.WriteAllText(filePath, json);
}
总结
| 技术 | 适用场景 | 推荐场景 |
|---|---|---|
| JSON | Web API、跨平台、可读性要求高 | 现代应用开发 |
| XML | 遗留系统、复杂数据结构 | 企业级配置/SOAP服务 |
| Binary | 高性能、封闭环境 | 游戏或特定高性能场景 |
提示:在.NET Core/5+中优先选择
System.Text.Json,需兼容旧项目时可使用Newtonsoft.Json。
