.NET 6 攻略大全(三)( 四 )


给定一个简单的类型:

namespace Test { internal class JsonMessage { public string Message { get; set; } } } 源生成器可以配置为为示例 JsonMessage 类型的实例生成序列化逻辑 。 请注意 , 类名JsonContext是任意的 。 您可以为生成的源使用所需的任何类名 。
using System.Text.Json.Serialization; namespace Test{[JsonSerializable(typeof(JsonMessage)]internal partial class JsonContext : JsonSerializerContext{}}
使用此模式的序列化程序调用可能类似于以下示例 。 此示例提供了可能的最佳性能 。
using MemoryStream ms = new;using Utf8JsonWriter writer = new(ms);JsonSerializer.Serialize(jsonMessage, JsonContext.Default.JsonMessage);writer.Flush;
// Writer contains:// {"Message":"Hello, world!"}
最快和最优化的源代码生成模式——基于Utf8JsonWriter——目前仅可用于序列化 。 Utf8JsonReader根据您的反馈 , 将来可能会提供对反序列化的类似支持 。
源生成器还发出类型元数据初始化逻辑 , 这也有利于反序列化 。 JsonMessage要反序列化使用预生成类型元数据的实例 , 您可以执行以下操作:
JsonSerializer.Deserialize(json, JsonContext.Default.JsonMessage);▌JsonSerializer 支持 IAsyncEnumerable
您现在可以使用System.Text.Json (反)序列化IAsyncEnumerable<T>JSON数组 。 以下示例使用流作为任何异步数据源的表示 。 源可以是本地计算机上的文件 , 也可以是数据库查询或 Web 服务 API 调用的结果 。
JsonSerializer.SerializeAsync已更新以识别并为IAsyncEnumerable值提供特殊处理 。
using System;using System.Collections.Generic;using System.IO;using System.Text.Json;static async IAsyncEnumerable<int> PrintNumbers(int n){for (int i = 0; i < n; i++) yield return i;}
using Stream stream = Console.OpenStandardOutput;var data = https://www.sohu.com/a/new { Data = PrintNumbers(3) };await JsonSerializer.SerializeAsync(stream, data); // prints {"Data":[0,1,2]}
IAsyncEnumerable 仅使用异步序列化方法支持值 。 尝试使用同步方法进行序列化将导致NotSupportedException被抛出 。
流式反序列化需要一个新的 API 来返回 I AsyncEnumerable<T>. 我们为此添加了JsonSerializer.DeserializeAsyncEnumerable方法 , 您可以在以下示例中看到 。
using System;using System.IO; using System.Text;using System.Text.Json;var stream = new MemoryStream(Encoding.UTF8.GetBytes("[0,1,2,3,4]"));await foreach (int item in JsonSerializer.DeserializeAsyncEnumerable<int>(stream)){Console.WriteLine(item);}
此示例将按需反序列化元素 , 并且在使用特别大的数据流时非常有用 。 它仅支持从根级 JSON 数组读取 , 尽管将来可能会根据反馈放宽 。
现有 DeserializeAsync 方法名义上支持 I AsyncEnumerable<T> , 但在其非流方法签名的范围内 。 它必须将最终结果作为单个值返回 , 如以下示例所示 。
using System;using System.Collections.Generic;using System.IO;using System.Text;using System.Text.Json;var stream = new MemoryStream(Encoding.UTF8.GetBytes(@"{""Data"":[0,1,2,3,4]}"));var result = await JsonSerializer.DeserializeAsync<MyPoco>(stream);await foreach (int item in result.Data){Console.WriteLine(item);}

特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。