簡體   English   中英

如何序列化第三方課程?

[英]How to serialize 3rd party class?

我有一個使用第三方庫的WCF服務。 該庫不可序列化。

我有一個可序列化的自定義類型,還包括第三方庫中的一個類作為屬性。 看起來像:

MyClass.ThirdPartyClass

問題是當我將MyClass發送出服務時,ThirdPartyClass會丟失我在服務中分配的值。 由於我沒有ThirdPartyClass的源代碼,我可以將其標記為可序列化。

有沒有辦法將ThirdPartyClass標記為可序列化或其他一些方法來保留值?

我建議創建一個數據傳輸對象,其中包含您希望通過服務提供的數據。 在從服務返回之前,使用新的DTO並將ThirdPartyClass的數據映射到DTO,而不是將ThirdPartyClass作為MyClass的一部分。 也許像AutoMapper這樣的框架可以在此任務中為您提供支持。
雖然這意味着一些額外的努力,但它也會在您的服務的客戶端和第三方庫之間創建一個抽象層。 這有助於您稍后更改到另一個庫,而無需更改服務的界面。

我過去處理這類問題的方法是創建一個你可以控制的“影子”類,它是可序列化的,包含你要公開的那個類的部分。

然后,您的類中將有兩個屬性,一個嚴格用於序列化,另一個用於內部用途。

例如,假設第三方類看起來像這樣:

public class ThirdPartyClass
{
    public int Property1 { get; set; }
    public string Property2 { get; set; }
}

您可以創建這樣的可序列化版本(假設您使用的是DataContracts):

[DataContract()]
public class ThirdPartyClassSerializable
{
    private ThirdPartyClass m_TPC = new ThirdPartyClass();

    public ThirdPartyClassSerializable();
    public ThirdPartyClassSerializable(ThirdPartyClass oTPC)
    {
        m_TPC = oTPC;
    }

    public ThirdPartyClass GetThirdPartyClass()
    {
        return m_TPC;
    }

    [DataMember()]
    public int Property1
    {
        get
        {
            return m_TPC.Property1;
        }
        set
        {
            m_TPC.Property1 = value;
        }
    }

    [DataMember()]
    public string Property2
    {
        get
        {
            return m_TPC.Property2;
        }
        set
        {
            m_TPC.Property2 = value;
        }
    }
}

然后你的根可序列化類看起來像:

[DataContract()]
public class MyClass
{
    private ThirdPartyClass m_ThirdPartyClass;

    public ThirdPartyClass ThirdPartyClass
    {
        get
        {
            return m_ThirdPartyClass;
        }
        set
        {
            m_ThirdPartyClass = value;
        }
    }

    [DataMember()]
    public ThirdPartyClassSerializable ThirdPartyClassSerialized
    {
        get
        {
            return new ThirdPartyClassSerializable(this.ThirdPartyClassNonSerialized);
        }
        set
        {
            this.ThirdPartyClass = value.GetThirdPartyClass();
        }
    }
}

使用此方法,數據按預期序列化到外部調用者,並且原始類始終可供內部調用者使用。

這方面的第二個優點是,您可以根據需要或多少暴露第三方課程。

暫無
暫無

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

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