WCF:有没有办法删除ExtensionData字段?

时间:2009-03-11 18:45:49

标签: c# wcf serialization

我刚刚开始使用WCF,我已经遇到了一个改变项目的问题。我创建了一个服务并在webservice中引用了引用,但webservice xml文件中的每个字段都带有一个ExtensionData字段。

示例:

删除了死亡的ImageShack链接

我不想要这个。我只需要它:

删除了死亡的ImageShack链接

有没有办法删除这个字段?一些不同类型的序列化?

7 个答案:

答案 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 {}