我正在使用第三方DLL中的实例类,并且需要对特定实例进行深度复制。该类未标记为Serializable
,因此我无法使用此建议方法使用BinaryFormatter
。
如何在不使用序列化的情况下获得对象的深层副本?
我正在使用第三方DLL中的实例类,并且需要对特定实例进行深度复制。该类未标记为Serializable
,因此我无法使用此建议方法使用BinaryFormatter
。
如何在不使用序列化的情况下获得对象的深层副本?
我一直很成功地使用Copyable。它在底层使用了反射技术,是开源的。请务必阅读限制和陷阱以确定您是否可以使用它。
一个建议是使用Json序列化(它使用反射,不依赖于[Serializable]
属性)将对象序列化和反序列化为副本。例如,使用Json.Net库:
var copiedObject = JsonConvert.DeserializeObject<Snapshot>(
JsonConvert.SerializeObject(sourceSnapshotObject));
你不能这样做(或者也许不应该这样做)。
如果类没有被设计成可序列化的,并且它没有提供克隆它的方法(例如 clone 或 copy 方法),那么你就不能轻易地自动完成这个任务。(而且,如果没有提供这种功能,那么你可能不应该这样做,因为这个类可能没有考虑到这种用法。)
然而,如果你真的想这样做,并且你处于完全信任的环境中,那么当然可以使用 FormatterServices.GetUninitializedObject
来进行一些肮脏的操作,然后使用反射将一个对象的字段值复制到另一个对象中。但这几乎肯定是一个坏主意。
Serializable
是 API 开发人员缺乏远见所致。 - Josh Stodola