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