我有一个不是我自己写的对象,我需要在内存中克隆。对象未标记ICloneable
或Serializable
通过接口进行深度克隆或序列化将不起作用。反正有没有深度克隆这个对象?可能是不安全的 win32 API 调用?
3 回答
仅供参考 标记为ICloneable
的接口不一定是深度复制的。这取决于实施者来实施ICloneable
,并且不能保证他们会克隆它。
你说对象没有实现ISerializable
,但它有Serializable
属性吗?
通过二进制序列化创建深层副本可能是我所知道的最简单的方法之一,因为您可以用 3-5 行代码克隆任何复杂的图形。另一种选择是XmlSerializer
对象是否可以XmlSerialized
(您没有为序列化指定任何属性或实现接口,但是如果有一个IDictionary
接口是您的软管。
除此之外,我真的什么都想不出来。如果所有数据都可以公开访问,您可以进行自己的克隆程序。如果不是,您仍然可以通过使用反射来克隆它来设置私有数据。
“深”是棘手的一点。对于浅拷贝,您可以使用反射来复制字段(假设没有一个是只读的,这是一个很大的假设) - 但否则很难让它(自动)工作。
另一种选择是自己提供序列化程序(并序列化为深度克隆)——“序列化代理”。这是一个 VB 示例。
我认为你可以做到这一点的唯一方法是认真思考以分离对象及其所有成员(它们本身可能是具有成员的其他对象等)。这就是框架序列化程序将要做的事情,但它只会对已适当标记的事物执行此操作。
我不确定像 Mono.Cecil 这样的工业级反射库是否有一些有用的东西。
我怀疑您是否提出了一个强大的通用解决方案(例如,静态成员可能难以正确处理),但您可能会在特定情况下使某些东西起作用。