.NET高级开发中,如何实现高效的序列化和反序列化操作?
摘要:目录.NET 中的序列化和反序列化编写类型转换器枚举转换器.NET 是如何序列化枚举实现枚举转换器如何使用类型转换器使用官方的转换器字符串和值类型转换时间类型转换器从底层处理 JSONUtf8JsonReaderUtf8JsonReader
目录.NET 中的序列化和反序列化编写类型转换器枚举转换器.NET 是如何序列化枚举实现枚举转换器如何使用类型转换器使用官方的转换器字符串和值类型转换时间类型转换器从底层处理 JSONUtf8JsonReaderUtf8JsonReader 和 JsonNode 解析 JSON 性能测试
.NET 中的序列化和反序列化
在 ASP.NET Core 应用中,框架会屏蔽了很多实现序列化和反序列化的细节,我们只需要定义参数模型,ASP.NET Core 会自动将 http 请求的 Body 反序列化为模型对象。但是日常开发中我们会对序列化和反序列化做许多定制配置,比如忽略值为 null 的字段、时间格式处理、忽略大小写、字段类型转换等各种情况。因此笔者单独使用一章讲解序列化框架的使用以及如何进行定制,深入了解 .NET 中序列化和反序列化机制。
System.Text.Json 是 .NET 框架自带的序列化框架,简单易用并且性能也很出色,使用 System.Text.Json 反序列化字符串为对象是很简单的,示例如下:
// 自定义序列化配置
static JsonSerializerOptions jsonSerializerOptions = new JsonSerializerOptions()
{
PropertyNameCaseInsensitive = true,
WriteIndented = true
};
public static void Main()
{
const string json =
"""
{
"Name": "工良"
}
""";
var obj = JsonSerializer.Deserialize<Model>(json, jsonSerializerOptions);
}
public class Model
{
public string Name { get; set; }
}
JsonSerializerOptions 的属性定义了如何序列化和反序列化,其常用属性如下:
属性
类型
说明
AllowTrailingCommas
bool
忽略 JSON 中多余的逗号
Converters
IList<JsonConverter>
转换器列表
DefaultBufferSize
int
默认缓冲区大小
DefaultIgnoreCondition
JsonIgnoreCondition
当字段/属性的值为默认值时,是否忽略
DictionaryKeyPolicy
JsonNamingPolicy
字典 Key 重命名规则,如首字母生成小写
IgnoreNullValues
bool
忽略 JSON 中值为 null 的字段/属性
IgnoreReadOnlyFields
bool
忽略只读字段
IgnoreReadOnlyProperties
bool
忽略只读属性
IncludeFields
bool
是否处理字段,默认只处理属性
MaxDepth
int
最大嵌套深度,默认最大深度为 64
NumberHandling
JsonNumberHandling
如何处理数字类型
PropertyNameCaseInsensitive
bool
忽略大小写
PropertyNamingPolicy
JsonNamingPolicy
重命名规则,如首字母生成小写
ReadCommentHandling
JsonCommentHandling
处理注释
WriteIndented
bool
序列化时格式化 JSON,如换行、空格、缩进
接下来笔者将会列举一些常用的定制场景和编码方法,为了避免混肴,在本章中所指的 “字段” 或 “属性”,等同于类型的“字段和属性”。
编写类型转换器
类型转换器的作用是当 json 对象字段和模型类字段类型不一致时,可以自动转换对应的类型,下面笔者介绍常用的几种类型转换器。
枚举转换器
.NET 是如何序列化枚举
编写 WebAPI 的模型类时常常会用到枚举,枚举类型默认会以数值的形式输出到 json 中。
