.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 中。
阅读全文