1.序列化的定义方式及应用场景
1.1 题目
序列化是什么?常见的序列化方式有哪些?什么时候我们会用到序列化?
1.2 深入解析
序列化(Serialization)是将内存中的对象状态转换为可存储或传输的格式(如字节流或文本)的过程,反序列化(Deserialization)则是其逆向操作。借助序列化,我们可以方便地实现数据持久化、跨进程或跨网络传输,以及缓存管理等功能。
常见序列化方式及示例:
XML 序列化
使用XmlSerializer将对象转为可读的 XML 文本:[Serializable] public class Person { public string Name { get; set; } public int Age { get; set; } } // 序列化 var person = new Person { Name = "Alice", Age = 30 }; var xmlSerializer = new XmlSerializer(typeof(Person)); using (var stream = new FileStream("person.xml", FileMode.Create)) { xmlSerializer.Serialize(stream, person); } // 反序列化 using (var stream = new FileStream("person.xml", FileMode.Open)) { var loaded = (Person)xmlSerializer.Deserialize(stream); }JSON 序列化
使用System.Text.Json(或Newtonsoft.Json)生成轻量级 JSON 文本:// 序列化 var json = JsonSerializer.Serialize(person); File.WriteAllText("person.json", json); // 反序列化 var jsonText = File.ReadAllText("person.json"); var person2 = JsonSerializer.Deserialize<Person>(jsonText);二进制序列化
使用BinaryFormatter(已标记为过时,仅作示例;生产推荐使用安全方案如 protobuf-net):var formatter = new BinaryFormatter(); using (var stream = new FileStream("person.dat", FileMode.Create)) { formatter.Serialize(stream, person); } using (var stream = new FileStream("person.dat", FileMode.Open)) { var person3 = (Person)formatter.Deserialize(stream); }第三方高性能格式
如 Protobuf(protobuf-net)、MessagePack 等,序列化和反序列化速度快、体积小:// 使用 protobuf-net 示例 using (var stream = new FileStream("person.proto", FileMode.Create)) { Serializer.Serialize(stream, person); }
使用场景:
- 数据持久化:保存游戏存档、用户设置到文件或数据库,重启后恢复对象状态。
- 网络通讯:客户端与服务器之间交换对象数据(Web API、RPC)。
- 缓存/消息队列:将对象放入分布式缓存或消息中间件,进行跨进程传递。
1.3 答题示例
“序列化是把程序里的对象状态转成可存储或传输的格式,反序列化则是还原对象。常用方式有 XML(
XmlSerializer)、JSON(System.Text.Json/Newtonsoft.Json)、二进制(BinaryFormatter,推荐安全替代)、以及 Protobuf/MessagePack 等高性能库。我们在保存游戏进度、Web API 数据交换、缓存和消息队列等场景都会用到。”
1.4 关键词联想
- 对象 → 字节流/文本
- 持久化 / 恢复
- 网络传输 / RPC
- XML / JSON / 二进制
- Protobuf / MessagePack
- 反序列化
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com