【问题标题】:How to serialize 3rd party class?如何序列化 3rd 方类?
【发布时间】:2013-11-06 06:15:15
【问题描述】:

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

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

MyClass.ThirdPartyClass

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

是否有某种方法可以将 ThirdPartyClass 标记为可序列化或其他方法让它保留值?

【问题讨论】:

  • 您应该能够结合使用 Reflection 和 XmlTextWriter 来枚举公共属性并写入 XML。今晚晚些时候我会尝试制作一个示例应用程序
  • 嗯,好主意。也许已经有一些东西可以做到这一点?不知道你会在什么下搜索。
  • 请告诉我您没有尝试序列化 UI。

标签: c# .net wcf


【解决方案1】:

我建议创建一个数据传输对象,其中包含您希望通过服务提供的数据。不要将 ThirdPartyClass 作为 MyClass 的一部分,而是使用新的 DTO 并将 ThirdPartyClass 的数据映射到 DTO,然后再从服务返回。也许像 AutoMapper 这样的框架可以支持你完成这项任务。
虽然这意味着一些额外的工作,但它也在您的服务的客户端和 3rd 方库之间创建了一个抽象层。这使您可以稍后更改到另一个库,而无需更改服务接口。

【讨论】:

    【解决方案2】:

    我过去处理此类问题的方法是创建一个您控制的“影子”类,该类可序列化并包含您想要公开的该类的部分。

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

    例如,假设第三方类如下所示:

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

    使用这种方法,数据会按预期序列化给外部调用者,并且原始类始终可供内部调用者使用。

    这样做的第二个优势是您可以根据需要公开尽可能多或尽可能少的第三方类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多