【发布时间】:2021-12-30 00:17:11
【问题描述】:
我是使用 System.Text.Json 的新手。我使用的是 BinaryFormatter,由于 Binaryformmater 的安全漏洞,现在需要迁移到 System.Text.Json。我需要将对象序列化到流中并将其存储在磁盘中。然后在调用 get 方法时,它应该获取流并将数据反序列化为对象。我没有发现文档有用 (https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-how-to?pivots=dotnet-6-0)。下面是伪代码,我需要编写 JsonSerializer 类。有人可以帮我吗?
public class Foo
{
public void get()
{
using (MemoryStream stream = new MemoryStream())
{
FetchStreamFromDisk() // Fetches stream from disk
return JsonSerializer.deserialize(stream)
}
}
public void Put(Object data)
{
using (MemoryStream stream = new MemoryStream())
{
JsonSerializer.serialize(data, stream);
StoreStreamIntoDisk()// Store the data into the disk/DB. So the stream should not get closed in the JsonSerializer Class
}
}
}
public static class JsonSerializer
{
public void serialize(Object data, out MemoryStream stream)
{
// Serialize Data
}
public Object deserialize(MemoryStream stream)
{
// Deserialize Data
}
}
【问题讨论】:
-
文档很好。问题是
BinaryFormatter与 JSON 或任何类型的文本格式的序列化无关,因此您使用的任何模式或习语现在都无法使用。你实际上是在错误地看待这个问题。 System.Text.Json 的等价物是 XmlSerializer、DataContractSerializer、Json.NET。与 BinaryFormatter 不同,所有序列化程序都适用于整个对象图,而不是单个字段 -
您想解决的实际问题是什么?将 BinaryFormatter 替换为 binary 序列化?你想如何使用你的序列化代码?序列化器是基于对象的。 XML 和 JSON 都不是二进制序列化的好选择。更好的选择是协议缓冲区,gRPC 的二进制格式。您可以使用.NET's gRPC tooling 或protobuf-net 指定对象的架构并对其进行序列化。
-
XMLSerializers 比 JsonSerializers 慢,根据多个博客(例如:inspiration.nlogic.ca/en/…)。所以,我想使用 JsonSerializer。在 JsonSerializer 中,有 2 个序列化器,即 System.text.json 和 NewtonsoftJson。但是,我想使用 system.text.json,因为它比另一个更快、更安全。
-
这并不能解释您的问题和问题。而且 JSON 仍然是一种文本格式,比二进制格式更大更慢
-
我想从使用 BinaryFormatter 迁移到 System.Text.Json 的 JsonSerializer。
标签: .net .net-core system.text.json jsonserializer