Глубокое копирование экземпляра класса .NET без сериализации - PullRequest
8 голосов
/ 28 января 2010

Я использую класс экземпляра из сторонней библиотеки DLL, и мне нужно сделать глубокую копию для конкретного экземпляра. Класс не помечен как Serializable, и поэтому я не могу использовать этот предложенный метод, используя BinaryFormatter.

Как получить полную копию этого объекта без использования сериализации?

Ответы [ 3 ]

5 голосов
/ 28 января 2010

Я использую Копируемый с большим успехом. Использует отражение под капотом. Это с открытым исходным кодом. Обязательно прочитайте Ограничения и подводные камни , чтобы узнать, сможете ли вы его использовать.

1 голос
/ 24 августа 2017

Одно из предложений - использовать сериализацию Json (которая использует отражение и не зависит от атрибута [Serializable]) для сериализации и десериализации в копию. Например, используя библиотеку Json.Net:

var copiedObject = JsonConvert.DeserializeObject<Snapshot>(
    JsonConvert.SerializeObject(sourceSnapshotObject));
0 голосов
/ 28 января 2010

Вы не можете (или, возможно, не должны это то, что я ищу).

Если класс не предназначен для сериализации и не предоставляет вам средств для его клонирования (т. Е. В форме метода клонирования или копирования), вы не можете легко сделать это автоматически. (И, кроме того, если это средство не предоставляется, то, вероятно, вам не следует этого делать, поскольку класс, вероятно, не предназначен для этого типа использования.)

Однако, если вы действительно хотите это сделать и находитесь в среде полного доверия, тогда, конечно, вы можете сделать некоторые грязные вещи, используя FormatterServices.GetUninitializedObject, а затем используя отражение, чтобы скопировать значения полей из одного объекта в другой. , Но это почти наверняка плохая идея.

...