C# (.NET) 中的对象序列化:JSON、XML 和 Binary

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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

推荐