簡體   English   中英

如何序列化包含接口的不可修改的類?

[英]How do you serialize an unmodifiable class that contains an interface?

我正在嘗試序列化包含接口的對象。 但是,接口無法序列化。 通常,我會使用類似NonSerialized標記的東西,但我無法弄清楚如何將此屬性應用於我無法修改的類,例如預定義的.NET類之一(例如: System.Diagnostics.Process )。

例如,請考慮以下代碼:

using System.Diagnostics
using System.Xml.Serialization;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            XmlSerializer x = new XmlSerializer(typeof(Process));
        }
        catch (Exception e)
        {
            Console.WriteLine(e.InnerException.InnerException.Message);
        }
    }
}

這將打印以下結果:

Cannot serialize member System.ComponentModel.Component.Site of type System.ComponentModel.ISite because it is an interface.

有沒有辦法在我無法修改的類中執行以下任何操作,例如系統類?

  1. 在序列化期間有選擇地忽略子元素,以便子元素根本不會被序列化
  2. 使用與NonSerialized完成相同的操作標記元素

我已經想到了一些解決方案,比如使用反射來動態生成一個類,該類包含與要序列化的類相同的所有成員,執行某種類型的深層復制以及序列化。 但是,我很想知道是否有更簡單的方法來完成此序列化任務,而不是去生成反射路徑的類。

如果現有類型的序列化變得復雜,最好的選擇始終是:創建一個單獨的DTO模型 - 看起來有點類似於您的域實體,但只存在與序列化很好地協作 - 通常非常簡單(無參數構造函數,基本訪問器,沒有驗證等)。 然后在他們之間映射。 否則,你將會玩一個不太喜歡的類型的序列化器來玩游戲。

如果你想要一個使用XmlSerializer的游戲:你可以創建一個XmlAttributeOverrides實例,手動為你的特定類型配置它(添加屬性實例),並將它傳遞給XmlSerializer構造函數。 但這很丑陋,非常繁瑣,你必須必須緩存並重新使用序列化程序實例(如果使用構造函數的重載,則不適用正常的自動程序集緩存/重用)。 您可以(從XmlAttributeOverrides實例)獲取每個類型或每個成員的XmlAttributes實例,然后根據需要獲取XmlIgnore屬性為true。 坦率地說,我建議反對這種做法。

通常,您序列化自己實現的對象,這樣可以在這樣的實例中完全控制。 我將創建一個實現ISerializable的包裝器對象,並在其構造函數中接受一個Process對象。 這樣,您可以控制自己序列化的字段。

話雖如此,序列化可執行流程似乎並不可行。 我想你會想要序列化一個包含行數據的對象,然后在線路的另一端消費(在反序列化時)。 Process類表示系統中正在運行的代碼實例,因此想要序列化它似乎很奇怪。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM