gpt4 book ai didi

binaryformatter - 有没有一种高性能的方法来替换 .NET5 中的 BinaryFormatter?

转载 作者:行者123 更新时间:2023-12-04 04:28:37 25 4
gpt4 key购买 nike

在 .NET5 之前,我们通过以下代码序列化/反序列化字节/对象:

    private static byte[] StructToBytes<T>(T t)
{
using (var ms = new MemoryStream())
{
var bf = new BinaryFormatter();
bf.Serialize(ms, t);
return ms.ToArray();
}
}

private static T BytesToStruct<T>(byte[] bytes)
{
using (var memStream = new MemoryStream())
{
var binForm = new BinaryFormatter();
memStream.Write(bytes, 0, bytes.Length);
memStream.Seek(0, SeekOrigin.Begin);
var obj = binForm.Deserialize(memStream);
return (T)obj;
}
}
但出于安全原因,BinaryFormatter 将被删除:
https://docs.microsoft.com/zh-cn/dotnet/standard/serialization/binaryformatter-security-guide
那么有没有一些简单但高性能的方法来代替 BinaryFormatter 呢?

最佳答案

在我最近从 .NET Core 3.1 迁移到 .NET 5 的项目中,我用 Protobuf-net 替换了我们的 BinarySerializer 代码:https://github.com/protobuf-net/protobuf-net
代码几乎完全相同,该项目在 GitHub 上(目前)有 2200 万次下载和 320 万颗星,享有盛誉。它非常快,并且没有围绕 BinarySerializer 的安全包袱。
这是我的 byte[] 序列化类:

public static class Binary
{
/// <summary>
/// Convert an object to a Byte Array, using Protobuf.
/// </summary>
public static byte[] ObjectToByteArray(object obj)
{
if (obj == null)
return null;

using var stream = new MemoryStream();

Serializer.Serialize(stream, obj);

return stream.ToArray();
}

/// <summary>
/// Convert a byte array to an Object of T, using Protobuf.
/// </summary>
public static T ByteArrayToObject<T>(byte[] arrBytes)
{
using var stream = new MemoryStream();

// Ensure that our stream is at the beginning.
stream.Write(arrBytes, 0, arrBytes.Length);
stream.Seek(0, SeekOrigin.Begin);

return Serializer.Deserialize<T>(stream);
}
}
我确实必须向我序列化的类添加属性。它只用 [Serializable] 装饰,虽然我知道 Protobuf 可以处理很多常见的装饰,但那个不起作用。从github上的例子:
[ProtoContract]
class Person {
[ProtoMember(1)]
public int Id {get;set;}
[ProtoMember(2)]
public string Name {get;set;}
[ProtoMember(3)]
public Address Address {get;set;}
}

[ProtoContract]
class Address {
[ProtoMember(1)]
public string Line1 {get;set;}
[ProtoMember(2)]
public string Line2 {get;set;}
}
就我而言,我正在 Redis 中缓存内容,并且效果很好。
也可以在您的 .csproject 文件中重新启用它:
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
</PropertyGroup>
……但这是个坏主意。 BinaryFormatter 对 .NET 的许多历史漏洞负责,而且无法修复。它可能会在 .NET 的 future 版本中完全不可用,因此更换它是正确的做法。

关于binaryformatter - 有没有一种高性能的方法来替换 .NET5 中的 BinaryFormatter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64799591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com