我正在使用来自第三方DLL的实例类,我需要在特定实例上进行深层复制。该课程未标记为Serializable
,因此我无法使用this suggested method using BinaryFormatter
。
如何在不使用序列化的情况下获取此对象的深层副本?
答案 0 :(得分:5)
我一直在使用Copyable取得巨大成功。它使用引擎盖下的反射。它是开源的。请务必阅读限制和陷阱,看看是否可以使用它。
答案 1 :(得分:1)
一个建议是使用Json序列化(使用反射,不依赖于[Serializable]
属性)来序列化和反序列化为副本。例如,使用Json.Net库:
var copiedObject = JsonConvert.DeserializeObject<Snapshot>(
JsonConvert.SerializeObject(sourceSnapshotObject));
答案 2 :(得分:0)
你不能(或者可能不应该是我正在寻找的东西)。
如果该类不是为了序列化而设计的,并且它没有为您提供克隆它的方法(即以克隆或复制方法的形式),那么您不能轻易地自动执行此操作。 (此外,如果没有提供此功能,那么您可能不应该这样做,因为该类可能没有考虑到这种类型的使用而设计。)
但是,如果你真的想要这样做并且你处于一个完全信任的环境中,那么当然你可以使用FormatterServices.GetUninitializedObject
做一些脏东西,然后使用反射将字段值从一个对象复制到另一个。但这几乎肯定是一个坏主意。