序列化是啥?
就是把一个 C# 对象(比如 Person、Order)变成一串能存文件、能发网络的“字符串”或“字节”。
反序列化就是反过来,把这串东西变回对象。
为啥要干这事?
- 存到文件(比如保存游戏进度)
- 发给别的程序(比如 Web API 返回 JSON)
- 缓存数据
C# 里最常用的三种方式:XML、JSON(用 JsonConvert)、二进制。下面全用真实文件读写来演示,不玩虚的!
本版专门用 JsonConvert
(Newtonsoft.Json) 来做 JSON 序列化,因为很多人还在用它,而且 API 简单好记!
1. XML 序列化 —— 老派但稳定
适合场景:
- 配置文件(比如 .config)
- 老系统对接
- 人类能看懂(带标签,结构清晰)
️ 怎么用?(直接读写文件!)
// 1. 定义类(必须有 public 无参构造函数!)
public class Person
{public string Name { get; set; }public int Age { get; set; }
}
序列化:对象 → 写入 XML 文件
var person = new Person { Name = "张三", Age = 25 };
var xmlSerializer = new XmlSerializer(typeof(Person));using (var writer = new StreamWriter("person.xml"))
{xmlSerializer.Serialize(writer, person);
}
Console.WriteLine("已保存到 person.xml");
反序列化:从 XML 文件 → 读回对象
var xmlSerializer = new XmlSerializer(typeof(Person));using (var reader = new StreamReader("person.xml"))
{var person = (Person)xmlSerializer.Deserialize(reader);Console.WriteLine($"读取成功:{person.Name},{person.Age}岁");
}
✅ 生成的 person.xml
能用记事本打开,清清楚楚!
2. JSON 序列化 — 用 JsonConvert
为什么用 JsonConvert?
- API 超简单:
SerializeObject
/DeserializeObject
- 老项目标配,兼容性好
- 功能强大(忽略 null、格式化、自定义转换等)
前提:先装 NuGet 包!
- 在 Visual Studio:右键项目 → “管理 NuGet 程序包” → 搜索
Newtonsoft.Json
→ 安装 - 或命令行:
dotnet add package Newtonsoft.Json
- 代码顶部加:
using Newtonsoft.Json;
类还是那个类(不用改!)
public class Person
{public string Name { get; set; }public int Age { get; set; }
}
序列化:对象 → 写入 JSON 文件
var person = new Person { Name = "李四", Age = 30 };// 一行搞定序列化!
string json = JsonConvert.SerializeObject(person);// 写入文件
File.WriteAllText("person.json", json);
Console.WriteLine("已保存到 person.json");
反序列化:从 JSON 文件 → 读回对象
string json = File.ReadAllText("person.json");// 一行搞定反序列化!
var person = JsonConvert.DeserializeObject<Person>(json);Console.WriteLine($"读取成功:{person.Name},{person.Age}岁");
小技巧:让 JSON 更好看(带缩进)
string json = JsonConvert.SerializeObject(person, Formatting.Indented);
File.WriteAllText("person.json", json);
生成的 person.json
长这样:
{"Name": "李四","Age": 30
}
3. 二进制序列化 —快但“黑盒”(慎用!)
⚠️ 仅限 .NET Framework(如 4.8)!.NET Core / .NET 5+ 已废弃!
[Serializable]
public class Person
{public string Name { get; set; }public int Age { get; set; }
}
序列化到文件
var person = new Person { Name = "王五", Age = 28 };
using (var stream = new FileStream("person.dat", FileMode.Create))
{var formatter = new BinaryFormatter();formatter.Serialize(stream, person);
}
Console.WriteLine("已保存到 person.dat(乱码文件)");
从文件反序列化
using (var stream = new FileStream("person.dat", FileMode.Open))
{var formatter = new BinaryFormatter();var person = (Person)formatter.Deserialize(stream);Console.WriteLine($"读取成功:{person.Name},{person.Age}岁");
}
再强调:新项目别用!有安全风险!
三种方式对比(文件实测)
方式 | 库/命名空间 | 序列化代码 | 反序列化代码 |
---|---|---|---|
XML | System.Xml.Serialization |
xmlSerializer.Serialize(writer, obj) |
(Person)xmlSerializer.Deserialize(reader) |
JSON | Newtonsoft.Json |
JsonConvert.SerializeObject(obj) |
JsonConvert.DeserializeObject<Person>(json) |
二进制 | System.Runtime.Serialization.Formatters.Binary |
formatter.Serialize(stream, obj) |
(Person)formatter.Deserialize(stream) |
实际建议(说人话)
- 新项目 + 想省事? → 用
JsonConvert
,API 简单,文档多,社区熟。 - 新项目 + 追求性能? → 用 .NET 自带的
System.Text.Json
(但 API 稍复杂)。 - 老项目? → 大概率已经在用
JsonConvert
,继续用没问题。 - XML? → 只在对接老系统或读 .config 时用。
- 二进制? → 忘了它吧,除非你在修 10 年前的代码。
最后一句话总结:
JsonConvert.SerializeObject
是最接地气的 JSON 序列化方式——一行代码搞定,文件看得见,改得了,传得动!
装个 NuGet 包,加个 using,剩下的交给它!
搞定!现在你的 person.json
就躺在项目目录里,随时能打开看!