Я прекратил использовать сериализацию для глубокого копирования в любом случае, потому что недостаточно контроля (не каждый класс нужно копировать одинаково) Затем я начал реализовывать свои собственные интерфейсы глубокого копирования и копировать каждое свойство так, как оно должно быть скопировано.
Типичные способы копирования ссылочного типа:
- использовать конструктор копирования
- использовать фабричный метод (например, неизменяемые типы)
- используйте свой собственный "клон"
- копировать только ссылку (например, другой 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();
}
}
Вы можете подумать, что это огромный объем работы. Но, в конце концов, это просто и понятно, его можно настроить там, где нужно, и делать именно то, что вам нужно.