如何序列化第三方课程?

时间:2013-11-05 21:49:39

标签: c# .net wcf

我有一个使用第三方库的WCF服务。该库不可序列化。

我有一个可序列化的自定义类型,还包含第三方库中的一个类作为属性。它看起来像:

MyClass.ThirdPartyClass

问题是当我将MyClass发送出服务时,ThirdPartyClass会丢失我在服务中分配的值。由于我没有ThirdPartyClass的源代码,我可以将其标记为可序列化。

有没有办法将ThirdPartyClass标记为可序列化或其他一些方法让它保留值?

2 个答案:

答案 0 :(得分:4)

我建议创建一个数据传输对象,其中包含您希望通过服务提供的数据。在从服务返回之前,使用新的DTO并将ThirdPartyClass的数据映射到DTO,而不是将ThirdPartyClass作为MyClass的一部分。也许像AutoMapper这样的框架可以在此任务中为您提供支持。
虽然这意味着一些额外的努力,但它也会在您的服务的客户端和第三方库之间创建一个抽象层。这使您可以在以后更改为其他库,而无需更改服务的界面。

答案 1 :(得分:3)

我过去处理这类问题的方式是创造一个"影子"您控制的类是可序列化的,并包含您要公开的该类的部分。

然后,您的类中将有两个属性,一个严格用于序列化,另一个用于内部用途。

例如,假设第三方类看起来像这样:

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;
        }
    }
}

然后你的root可序列化类看起来像:

[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();
        }
    }
}

使用此方法,数据按预期序列化到外部呼叫者,并且原始类始终可供内部呼叫者使用。

这样做的第二个好处是,您可以根据需要或第一方暴露第三方课程。