C# 如何在不使用';二进制格式化程序';?

C# 如何在不使用';二进制格式化程序';?,c#,.net-core,deprecation-warning,C#,.net Core,Deprecation Warning,我有一点C代码,用于执行对象的深度复制: public static T Copy<T>(T objectToCopy) { T result = default(T); using (var memoryStream = new MemoryStream()) { var formatter = new BinaryFormatter(); formatter.Seri

我有一点C代码,用于执行对象的深度复制:

    public static T Copy<T>(T objectToCopy)
    {
        T result = default(T);

        using (var memoryStream = new MemoryStream())
        {
            var formatter = new BinaryFormatter();
            formatter.Serialize(memoryStream, objectToCopy);
            memoryStream.Seek(0, SeekOrigin.Begin);
            result = (T)formatter.Deserialize(memoryStream);
            memoryStream.Close();
        }

        return result;
    }
publicstatict复制(T objectToCopy)
{
T结果=默认值(T);
使用(var memoryStream=new memoryStream())
{
var formatter=新的二进制格式化程序();
序列化(memoryStream、objectToCopy);
memoryStream.Seek(0,SeekOrigin.Begin);
结果=(T)格式化程序。反序列化(memoryStream);
memoryStream.Close();
}
返回结果;
}
我从Visual Studio收到以下警告:

警告SYSLIB0011
“BinaryFormatter.Serialize(Stream)”已过时:“BinaryFormatter序列化已过时,不应使用。有关更多信息,请参阅

我收到了关于BinaryFormatter.Deserialize(Stream)的相同警告

我查看了建议的链接,他们列出了一些首选选项:

  • XmlSerializer
    DataContractSerializer
    将对象图序列化到XML中或从XML中序列化。不要将
    DataContractSerializer
    NetDataContractSerializer
    混淆
  • 用于XML和JSON的
    BinaryReader
    BinaryWriter
  • System.Text.Json
    API将对象图序列化为Json
我只是在努力弄清楚在我的具体案例中,我将如何实现其中的一个替代方案

如果有人能在这方面帮助我,我将不胜感激


谢谢。

您可以使用
System.Text.Json
对流进行序列化/反序列化,如下所示:,特别是
SerializeAsyn/DeserializeAsync
Json是文本,因此它不是直接的替代方法。更好的选择是gRPC使用的协议缓冲区格式,由.NET的gRPC工具或StackExchange的protobuf NET Library为您提供支持—您不需要序列化任何内容。您正在使用BinaryFormatter作为黑客为对象创建深度克隆。这仍然是一种黑客行为,很容易产生坏拷贝——您真的需要克隆存储在私有字段中的Singleton实例吗?因为这就是你目前的方法does@PanagiotisKanavos也许是迂腐的观点;但是protobuf net不以任何方式拥有/附属于/etc堆栈交换,也从来没有(它早于它们)在一般情况下,对一般对象进行深度克隆的唯一正确方法是涉及对象或以其他方式创建特定于每种类型的深度克隆实现。我这样说是因为在一般情况下,在对象内部可以找到大量不应该被克隆的东西。如果这些都不适用,请使用您提到的一个库,json或protobuf或诸如此类的库。