c# - 如何在不将类标记为可序列化的情况下对其进行深度复制

标签 c# deep-copy cloning

给定以下类:

class A
{
    public List<B> ListB;

    // etc...
}

其中 B 是另一个可能继承/包含其他一些类的类。


鉴于这种情况:

  1. A是一个大类,包含很多引用类型
  2. 我无法将 B 标记为 [Serializable],因为我无权访问 B
  3. 的源代码

以下执行深度复制的方法不起作用:

  1. 我不能使用 ICloneableMemberwiseClone 因为类 A 包含许多引用类型
  2. 我无法为 A 编写复制构造函数,因为该类很大并且不断被添加,并且包含无法深度复制的类(如 B)
  3. 我无法使用序列化,因为我无法将包含的类(如 B,其中没有可用的源代码)标记为 [Serializable]

如何深度复制类A

最佳答案

无论如何我都停止使用序列化进行深度复制,因为没有足够的控制(不是每个类都需要以相同的方式复制)。然后我开始实现自己的深拷贝接口(interface),按照应该拷贝的方式拷贝每一个属性。

复制引用类型的典型方法:

  • 使用拷贝构造函数
  • 使用工厂方法(例如不可变类型)
  • 使用你自己的“克隆”
  • 仅复制引用(例如其他根类型)
  • 创建新实例并复制属性(例如,不是您自己编写的缺少复制构造函数的类型)

例子:

class A
{
  // copy constructor
  public A(A copy) {}
}

// a referenced class implementing 
class B : IDeepCopy
{
  object Copy() { return new B(); }
}

class C : IDeepCopy
{
  A A;
  B B;
  object Copy()
  {
    C copy = new C();

    // copy property by property in a appropriate way
    copy.A = new A(this.A);
    copy.B = this.B.Copy();
  }
}

您可能认为这是一项巨大的工作量。但最后,它简单直接,可以在需要的地方进行调整,并完全按照您的需要进行。

关于c# - 如何在不将类标记为可序列化的情况下对其进行深度复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2545025/

相关文章:

java - 深度克隆 Java 对象(不是 bean)

c# - 静态属性赋值后为空

c# - 为什么 [Owin] 在新项目上抛出空异常?

silverlight - 如何在 Silverlight 中克隆路径资源?

Java克隆方法未按预期工作(极小极大算法案例)

C++ 传递 std::string 的最快方法?

C# 将 System.Data.Entity.DynamicProxies 克隆到实际(非代理)类?

c# - 有没有办法解决这个 c# 类型推断失败?

c# - 在 asp.net 中读取自定义标签 Prop

c# - 列表的深拷贝