WCF可序列化实体和_BackingField

WCF可序列化实体和_BackingField,wcf,serialization,Wcf,Serialization,我们有一个第三方dll,其中包含(除其他外)我们的实体。 所有实体都用[Serializeable]属性标记 我们现在需要创建一个新的WCF服务,它将公开其中一些实体。 问题是,由于实体未使用DataContract和DataMember属性声明,因此属性名称会附加\u BackingField 我知道使用DataContarct\Member属性可以解决此问题,但鉴于我无法使用实体修改第三方dll,是否有其他解决方法?我假设您希望从服务公开这些第三方类型 一个可以考虑的解决方案是保持一个单独的

我们有一个第三方dll,其中包含(除其他外)我们的实体。
所有实体都用
[Serializeable]
属性标记

我们现在需要创建一个新的WCF服务,它将公开其中一些实体。
问题是,由于实体未使用
DataContract
DataMember
属性声明,因此属性名称会附加
\u BackingField


我知道使用DataContarct\Member属性可以解决此问题,但鉴于我无法使用实体修改第三方dll,是否有其他解决方法?

我假设您希望从服务公开这些第三方类型

一个可以考虑的解决方案是保持一个单独的库,它反映了第三方库中的类型。 这有以下好处:

  • 所有权-您拥有要公开的类型,因此可以跨服务边界控制序列化/反序列化
  • 您可以避免突然更改另一方的类型,并且可以以可控的方式更改接口
  • 从SOA的角度来看,如果您在服务上公开另一方的类型,那么另一方应该以契约格式(如XSD)提供这些类型。我认为你的设计要求你进行一些相当不合理的跳跃

    这可能需要更多的前期工作,但这是一种一次性的练习


    希望这对一些人有所帮助。

    使用
    [Serializable]
    属性修饰的类型将其字段序列化,而不是属性(这是
    [Serializable]
    的“契约”)。如果第三方类型使用自动属性(如下所示),编译器将创建一个带有k_BackingField后缀的字段,这就是要序列化的字段

    如果无法更改第三方库中的类型,一种替代方法是在客户端上使用相同的库。为服务创建代理时(使用svcuti或Add service Reference),可以引用第三方库,生成的客户端不会为契约创建新类型,而是重用库中的类型。这样,您就不必处理具有public\u BackingField属性名的类型

    自动属性:

    [Serializable]
    public class MyType
    {
        public string MyProp { get; set; }
    }
    
    编译器将把它转换为类似于

    [Serializable]
    public class MyType
    {
        private string <MyProp>k_BackingField;
        public string MyProp
        {
            [CompilerGenerated]
            get { return this.<MyProp>k_BackingField; }
            [CompilerGenerated]
            set { this.<MyProp>k_BackingField = value; }
        }
    }
    
    [可序列化]
    公共类MyType
    {
    私有字符串k_BackingField;
    公共字符串MyProp
    {
    [编译生成]
    获取{返回this.k_BackingField;}
    [编译生成]
    设置{this.k_BackingField=value;}
    }
    }
    
    您可以在服务实现中使用XmlSerializer而不是DataContractSerializer


    它将执行得较慢,但应该可以解决您的问题。

    不再需要使用DataContract/DataMemeber进行装饰,因为.NET 3.5 SP1和所有公共属性都被WCF认为是可序列化的。您使用的是哪个.NET版本?这真的很奇怪,因为传统的Web服务(XMLSerializer)的工作原理正好相反——忽略字段并序列化公共属性。知道为什么要更改吗?
    XmlSerializer
    不会忽略字段,它会序列化所有公共字段和属性。
    DataContractSerializer
    (WCF中的默认值)从最初在远程处理中使用的格式化程序类(
    BinaryFormatter
    SoapFormatter
    )继承了它的行为,即序列化
    [Serializable]
    类型的所有字段。