Как выполнить глубокое копирование класса, не помечая его как сериализуемый

С учетом следующего класса:

class A
{
    public List<B> ListB;

    // etc...
}

, где B - это другой класс, который может наследовать / содержать некоторые другие классы.


С учетом этого сценария:

  1. A является большим классом и содержит много ссылочных типов
  2. Я не могу пометить B как [Serializable] , так как у меня нет доступа к исходному коду B

Следующие методы для глубокого копирования не работают:

  1. Я не могу использовать ICloneable или MemberwiseClone , поскольку класс A содержит много ссылочные типы
  2. Я не могу написать конструктор копирования для A , так как класс большой и постоянно добавляется, и содержит классы (такие как B ), которые не могут быть глубоко скопированы
  3. Я не могу использовать сериализацию, поскольку не могу пометить содержащийся класс (например, B , где нет исходного кода) как [Сериализуемый]

Как я могу глубоко копировать класс A ?

17
задан icedwater 19 September 2018 в 08:12
поделиться

2 ответа

Я все равно перестал использовать сериализацию для глубокого копирования, потому что не хватает контроля (не каждый класс нужно копировать одинаково). Затем я начал реализовывать свои собственные интерфейсы глубокого копирования и копировать каждое свойство так, как оно должно копироваться.

Типичные способы копирования ссылочного типа:

  • использовать конструктор копирования
  • использовать фабричный метод (например, неизменяемые типы)
  • использовать собственный "клон"
  • копировать только ссылку (например, другой Root-Type)
  • создать новый экземпляр и скопировать свойства (например, типы, написанные не самостоятельно, не имеющие конструктора копирования)

Пример:

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();
  }
}

Вы можете подумать, что это огромный объем работы. Но в конце концов, это легко и просто, может быть настроено, где нужно, и делает именно то, что вам нужно.

8
ответ дан 30 November 2019 в 14:36
поделиться

Разве вы не можете это сделать?

[Serializable]
class A
{
     ...
    [NonSerialized]
    public List<B> ListB;
    ....
}

А потом см. Как сделать глубокую копию объекта в .NET (в частности, C #)? для функции клонирования

0
ответ дан 30 November 2019 в 14:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: