8

我正在使用来自第三方 DLL 的实例类,我需要对特定实例进行深度复制。该类未标记为Serializable,因此我无法使用此建议的方法BinaryFormatter

如何在不使用序列化的情况下获取该对象的深层副本?

4

3 回答 3

5

我一直在使用Copyable并取得了巨大的成功。它在引擎盖下使用反射。它是开源的。请务必阅读限制和陷阱,看看您是否可以使用它。

于 2010-01-28T19:59:40.887 回答
2

一个建议是使用 Json 序列化(它使用反射,并且不依赖于[Serializable]属性)来序列化和反序列化为副本。例如,使用 Json.Net 库:

var copiedObject = JsonConvert.DeserializeObject<Snapshot>(
    JsonConvert.SerializeObject(sourceSnapshotObject));
于 2017-08-24T11:56:47.773 回答
0

你不能(或者也许不应该是我正在寻找的东西)。

如果该类不是为序列化而设计的,并且它没有为您提供克隆它的方法(即以克隆或复制方法的形式),那么您不能轻易地自动执行此操作。(此外,如果未提供此功能,那么您可能不应该这样做,因为该类可能在设计时并未考虑到这种用法。)

但是,如果您真的想这样做并且您处于完全信任的环境中,那么您当然可以使用FormatterServices.GetUninitializedObject然后使用反射将字段值从一个对象复制到另一个对象来做一些肮脏的事情。但这几乎可以肯定是个坏主意。

于 2010-01-28T19:57:53.460 回答