繁体   English   中英

我可以深度克隆没有标记为 ICloneable 或 Serializable 的 ac# 对象吗?

[英]Can I deep clone a c# object not tagged ICloneable or Serializable?

我有一个不是自己写的对象,我需要在内存中克隆。 该对象未标记为ICloneableSerializable因此通过接口或序列化进行深度克隆将不起作用。 反正有没有深度克隆这个对象? 可能是不安全的 win32 API 调用?

仅供参考 标记为ICloneable接口不一定是深度复制的。 由实施者来实施ICloneable并且不能保证他们会克隆它。

你说对象没有实现ISerializable但它有Serializable属性吗?

通过二进制序列化创建深层副本可能是我所知道的最简单的方法之一,因为您可以在 3-5 行代码中克隆任何复杂的图形。 如果对象可以是XmlSerializer则另一个选项是XmlSerialized (您没有指定任何序列化属性或实现接口,但是如果您使用了IDictionary接口。

除此之外,我真的想不出任何事情。 如果所有数据都可以公开访问,您可以执行自己的克隆程序。 如果不是,您仍然可以通过使用反射来克隆它来设置私有数据。

“深”是棘手的一点。 对于浅拷贝,您可以使用反射来复制字段(假设没有一个是只读的,这是一个很大的假设) - 但否则很难(自动)使其工作。

另一种选择是自己提供序列化程序(并序列化为深度克隆)-“序列化代理”。 这是一个 VB 示例。

我认为你能做到这一点的唯一方法是通过一些认真的反思来挑选对象及其所有成员(它们本身可能是其他具有成员的对象等)。 这就是框架序列化程序要做的事情,但它只会对已正确标记的事物执行此操作。

我不确定像 Mono.Cecil 这样的工业级反射库是否有一些帮助。

我怀疑您是否想出了一个强大的通用解决方案(例如,静态成员可能难以正确处理),但您可能会在特定情况下使某些事情起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM