如何在.NET(特别是C#)中对对象进行深层复制?

时间:2020-03-06 14:41:06  来源:igfitidea点击:

我想要一个真正的深复制。在Java中,这很容易,但是如何在C#中实现呢?

解决方案

我已经看到了几种不同的方法,但是我使用了如下的通用实用程序方法:

public static T DeepClone<T>(T obj)
{
 using (var ms = new MemoryStream())
 {
   var formatter = new BinaryFormatter();
   formatter.Serialize(ms, obj);
   ms.Position = 0;

   return (T) formatter.Deserialize(ms);
 }
}

笔记:

  • 为了使此类正常工作,班级必须标记为" [可序列化]"。
  • 源文件必须包含以下代码:
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;

以Kilhoffer的解决方案为基础...

使用C3.0,我们可以创建扩展方法,如下所示:

public static class ExtensionMethods
{
    // Deep clone
    public static T DeepClone<T>(this T a)
    {
        using (MemoryStream stream = new MemoryStream())
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, a);
            stream.Position = 0;
            return (T) formatter.Deserialize(stream);
        }
    }
}

扩展了任何使用DeepClone方法标记为[Serializable]的类

MyClass copy = obj.DeepClone();

也许我们只需要一个浅表副本,在这种情况下,请使用" Object.MemberWiseClone()"。

在" MemberWiseClone()"的文档中有很好的建议,可用于深层复制策略:-

http://msdn.microsoft.com/zh-CN/library/system.object.memberwiseclone.aspx