Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 7.2 序列化与反序列化

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);
}

总结

技术适用场景推荐场景
JSONWeb API、跨平台、可读性要求高现代应用开发
XML遗留系统、复杂数据结构企业级配置/SOAP服务
Binary高性能、封闭环境游戏或特定高性能场景

提示:在.NET Core/5+中优先选择 System.Text.Json,需兼容旧项目时可使用 Newtonsoft.Json。

Last Updated:: 5/3/25, 11:01 PM