微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

(de) 使用 System.Text.Json 序列化流

如何解决(de) 使用 System.Text.Json 序列化流

我正在尝试使用 System.Text.Json 的 JsonSerializer 将对象序列化为 MemoryStream。我无法在文档中找到它的实现/方法。有人可以分享使用 System.Text.Json 进行序列化和反序列化的示例实现吗?

解决方法

不清楚问题出在哪里,或者缺少哪些文档和示例,因为 docs.microsoft.com 中有多个部分以及数百篇博文和文章。在文档中,JSON serialization and deserialization 是一个很好的起点,How to serialize and deserialize (marshal and unmarshal) JSON in .NET 包括 Serialize to UTF8 部分。

MemoryStream 无论如何都只是 byte[] 数组上的 Stream 包装器,因此序列化为 MemoryStream 与直接序列化为 byte[] 数组相同。这可以通过 JsonSerializer.SerializeToUtf8Bytes:

完成
byte[] jsonUtf8Bytes =JsonSerializer.SerializeToUtf8Bytes(weatherForecast);

最后,在 .NET 中,任何需要序列化的东西都通过 Reader 和 Writer 对象工作,例如 TextReader、StreamReader、TextReader 和 -Writers。在 JSON.NET 的情况下,这是通过 Utf8JsonWriter 对象完成的。 JsonSerializer.Serialize 具有写入 Utf8JsonWriter 的重载:

using var stream=File.OpenWrite(somePath);
using var writer=new Utf8JsonWriter(stream);
JsonSerializer.Serialize(writer,myObject);

不过,这是使用 System.Text.Json缓慢方式。使用缓冲区意味着分配和清理它们,这很昂贵,尤其是在 Web 应用程序中。出于这个原因,ASP.NET Core 使用 IO pipelines 而不是流来接收和发送数据到套接字,使用从缓冲池租用的可重用缓冲区,并在 ASP.NET Core 管道中的每个步骤中传递。传递 byte[] 缓冲区会复制它们的内容,因此 .NET Core 引入了 Span<>Memory<> 类型,它们表示现有(可能是池化的)缓冲区上的 view .这样,ASP.NET Core 会传递缓冲区的这些“视图”,而不是缓冲区本身。

System.Text.Json 旨在使用管道和可重用内存而不是流,从而允许 ASP.NET Core 在高流量网站中使用最少的内存和尽可能少的分配。 ASP.NET Core 使用 Utf8JsonWriter(IBufferWriter) 构造函数通过 PipeWriter 写入输出管道。

我们可以使用相同的重载来写入带有 ArrayBufferWriter 的可重用缓冲区。这相当于使用 MemoryStream BUT 输出通过 ReadOnlySpan<byte>Memory<byte> 访问,因此不必复制:>

using var buffer=new ArrayBufferWriter<byte>(65536);
using var writer=new Utf8JsonWriter(buffer);
JsonSerializer.Serialize(writer,myObject);

ReadOnlySpan<byte> data=buffer.WrittenSpan;
,

更好的选择是使用 newtonsoft.json。

它有很多例子

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。