如何深度复制类而不将其标记为Serializable

Gad*_*esh 17 c# deep-copy cloning

鉴于以下课程:

class A
{
    public List<B> ListB;

    // etc...
}
Run Code Online (Sandbox Code Playgroud)

哪个B是可以继承/包含其他类的另一个类.


鉴于这种情况:

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

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

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

我怎样才能深造课A

Ste*_*ger 8

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

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

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

例:

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

你可能认为这是一项巨大的工作.但最后,它很简单直接,可以在需要的地方进行调整,并完全满足您的需求.