C# (.NET) 中的对象序列化:JSON、XML 和 Binary
序列化是将复杂对象(或对象图)转换为字节流或文本格式(JSON、XML)的过程。这对于将对象状态保存到文件、通过网络(REST API、gRPC)传输数据或缓存是必要的。反向过程——反序列化——从序列化表示中恢复对象。在 .NET 生态系统(包括 .NET Core 和 .NET 5/6/7/8)中,有几种内置的序列化机制。
1. System.Text.Json — 现代 JSON 序列化
从 .NET Core 3.0 开始,Microsoft 推荐使用 System.Text.Json 作为处理 JSON 的主要方式。该库轻量、高性能,并且不需要第三方依赖(与 Newtonsoft.Json 不同)。
基本序列化和反序列化示例
using System;using System.Text.Json;
public class Person{ public string Name { get; set; } public int Age { get; set; } public List<string> Hobbies { get; set; }}
class Program{ static void Main() { var person = new Person { Name = "阿列克谢", Age = 30, Hobbies = new List<string> { "阅读", "编程" } };
// 序列化 string json = JsonSerializer.Serialize(person); Console.WriteLine(json); // {"Name":"阿列克谢","Age":30,"Hobbies":["阅读","编程"]}
// 反序列化 Person restored = JsonSerializer.Deserialize<Person>(json); Console.WriteLine(restored.Name); // 阿列克谢 }}使用属性配置序列化
您可以控制 JSON 中的属性名称、忽略 null 值或使用自定义转换器:
using System.Text.Json.Serialization;
public class Product{ [JsonPropertyName("product_id")] public int Id { get; set; }
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] public string? Description { get; set; }
[JsonConverter(typeof(JsonStringEnumConverter))] public Status Status { get; set; }}
public enum Status { Active, Inactive }2. XmlSerializer — XML 序列化
XmlSerializer 类(命名空间 System.Xml.Serialization)在所有 .NET 版本中可用,非常适合与遗留系统或配置 XML 文件的兼容性。
使用 XmlSerializer 的示例
using System;using System.IO;using System.Xml.Serialization;
[XmlRoot("Employee")]public class Employee{ [XmlElement("FullName")] public string Name { get; set; }
[XmlAttribute("id")] public int Id { get; set; }
[XmlArray("Projects")] [XmlArrayItem("Project")] public List<string> Projects { get; set; }}
class Program{ static void Main() { var emp = new Employee { Id = 101, Name = "玛丽亚·伊万诺娃", Projects = new List<string> { "Alpha", "Beta" } };
var serializer = new XmlSerializer(typeof(Employee)); using (var writer = new StreamWriter("employee.xml")) { serializer.Serialize(writer, emp); }
// 反序列化 using (var reader = new StreamReader("employee.xml")) { Employee restored = (Employee)serializer.Deserialize(reader); Console.WriteLine(restored.Name); // 玛丽亚·伊万诺娃 } }}重要提示:XmlSerializer 要求类具有公共无参构造函数,并且可序列化的属性必须是公共的并具有 setter。
3. BinaryFormatter(已过时,但为遗留代码提及)
以前,System.Runtime.Serialization.Formatters.Binary.Bi