С учетом следующего класса:
class A
{
public List<B> ListB;
// etc...
}
, где B
- это другой класс, который может наследовать / содержать некоторые другие классы.
С учетом этого сценария:
A
является большим классом и содержит много ссылочных типов B
как [Serializable]
, так как у меня нет доступа к исходному коду B
Следующие методы для глубокого копирования не работают:
ICloneable
или MemberwiseClone
, поскольку класс A
содержит много ссылочные типы A
, так как класс большой и постоянно добавляется, и содержит классы (такие как B
), которые не могут быть глубоко скопированы B
, где нет исходного кода) как [Сериализуемый]
Как я могу глубоко копировать класс A
?
Я все равно перестал использовать сериализацию для глубокого копирования, потому что не хватает контроля (не каждый класс нужно копировать одинаково). Затем я начал реализовывать свои собственные интерфейсы глубокого копирования и копировать каждое свойство так, как оно должно копироваться.
Типичные способы копирования ссылочного типа:
Пример:
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();
}
}
Вы можете подумать, что это огромный объем работы. Но в конце концов, это легко и просто, может быть настроено, где нужно, и делает именно то, что вам нужно.
Разве вы не можете это сделать?
[Serializable]
class A
{
...
[NonSerialized]
public List<B> ListB;
....
}
А потом см. Как сделать глубокую копию объекта в .NET (в частности, C #)? для функции клонирования