簡體   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