1. JsonSerializer基础概念解析
在C#开发中,数据序列化是一个高频操作,而System.Text.Json命名空间下的JsonSerializer类已经成为.NET Core 3.0及以后版本的首选工具。相比传统的Newtonsoft.Json,它提供了更好的性能表现和更紧密的框架集成。
重要提示:JsonSerializer是.NET Core原生组件,不需要额外安装NuGet包(Unity环境需确认.NET版本支持情况)
序列化过程本质上是将对象图转换为JSON格式的字符串表示,而反序列化则是逆向操作。这个过程中,JsonSerializer会通过反射机制分析类型结构,决定哪些成员需要参与序列化。默认行为下:
- 公共属性(Property)会被自动序列化
- 公共字段(Field)会被忽略
- 私有成员无论属性还是字段都不会被处理
csharp复制// 典型序列化示例
var person = new Person { Name = "张三", Age = 30 };
string json = JsonSerializer.Serialize(person);
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 属性与字段的序列化差异详解
2.1 属性序列化的底层机制
属性之所以能被默认序列化,是因为它们本质上是方法(getter/setter)的语法糖。JsonSerializer在反射类型信息时,会识别这些特殊方法对:
csharp复制public class Person
{
// 会被序列化的属性
public string Name { get; set; }
// 等效的完整写法
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
}
CLR将属性编译为get_Name和set_Name方法,这些方法签名符合特定模式,使得序列化器能够识别它们作为数据载体。
2.2 字段被忽略的技术原因
字段是直接的内存存储位置,没有包装逻辑。JsonSerializer出于以下考虑默认忽略字段:
- 封装性原则:字段通常表示实现细节而非公共契约
- 安全性考虑:避免意外暴露内部状态
- 版本兼容性:字段名变更比属性名变更对序列化影响更大
csharp复制public class GameSave
{
// 不会被默认序列化的字段
public int score;
// 会被序列化的属性
public int Score { g
