我刚刚开始使用WCF,我已经遇到了一个改变项目的问题。我创建了一个服务并在webservice中引用了引用,但webservice xml文件中的每个字段都带有一个ExtensionData字段。
示例:
删除了死亡的ImageShack链接
我不想要这个。我只需要它:
删除了死亡的ImageShack链接
有没有办法删除这个字段?一些不同类型的序列化?
答案 0 :(得分:10)
ExtensionData实际上是一个必须内置到类型中的功能才能启用round-tripping。它始终由DataContractSerializer发出。 抑制此字段的一种可能方法是使用旧的XmlSerializer,通过使用XmlSerializerFormatAttribute修改服务合同界面。
答案 1 :(得分:3)
最有可能的是,您的DataContract类将实现IExtensibleDataObject
接口,对吧?这是ExtensionData
字段的责任 - 只需删除该界面,您也应该能够从DataContracts中删除ExtensionData
字段。
马克
答案 2 :(得分:2)
ExtensionData用于维护可能共享不同版本合同的服务之间的兼容性。传递消息时可以安全地忽略它。
你可以通过使用DataContract序列化程序之外的其他东西来摆脱它(我想的是旧学校[Serializable]),但我可能错了。
答案 3 :(得分:2)
将属性设置为null
会阻止它出现在生成的xml:
foreach(var elem in arrayOfElements)
{
elem.ExtensionData = null;
}
答案 4 :(得分:0)
没有回答这个问题,但也许这会有所帮助...
来自MSDN http://msdn.microsoft.com/en-us/library/ms731083.aspx:
可以通过在DataContractSerializer构造函数中将ignoreExtensionDataObject设置为true或者通过在ServiceBehaviorAttribute上将IgnoreExtensionDataObject属性设置为true来关闭往返功能。当此功能关闭时,反序列化器将不会填充ExtensionData属性,并且序列化程序将不会发出属性的内容。
答案 5 :(得分:0)
如果您的问题是[TestMethod]的断言,您可以使用http://www.fluentassertions.com从断言中排除每个ExtensionData属性。
例如
objToCheck.ShouldBeEquivalentTo(expectedObj, options => options.Excluding(o => o.ExtensionData));
答案 6 :(得分:-1)
使用[ServiceBehavior(IgnoreExtensionDataObject = true)]
装饰您的ServiceImplementation[ServiceBehavior(IgnoreExtensionDataObject=true)]
public class Service : IService {}