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

问题描述 投票:16回答:8

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

例:

删除了死的ImageShack链接

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

删除了死的ImageShack链接

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

c# wcf serialization
8个回答
10
投票

ExtensionData实际上是必须构建到类型中以启用round-tripping的功能。它始终由DataContractSerializer发出。抑制此字段的一种可能方法是使用旧的XmlSerializer,通过使用XmlSerializerFormatAttribute修改服务契约接口。


3
投票

最有可能的是,你的DataContract类将实现IExtensibleDataObject接口,对吧?这是负责ExtensionData字段 - 只需删除该接口,您也应该能够从DataContracts中删除ExtensionData字段。


2
投票

ExtensionData用于维护可能共享不同版本的合同的服务之间的兼容性。传递消息时可以安全地忽略它。

您可以通过使用除DataContract序列化程序之外的其他东西(我想到的旧学校[Serializable])来摆脱它,但我可能是错的。


2
投票

将属性设置为null可防止它出现在生成的xml中:

foreach(var elem in arrayOfElements)
{
    elem.ExtensionData = null;
}

0
投票

没有回答这个问题,但也许这有助于......

来自MSDN http://msdn.microsoft.com/en-us/library/ms731083.aspx

可以通过在DataContractSerializer构造函数中将ignoreExtensionDataObject设置为true或者通过在ServiceBehaviorAttribute上将IgnoreExtensionDataObject属性设置为true来关闭往返功能。当此功能关闭时,反序列化器将不会填充ExtensionData属性,并且序列化程序将不会发出该属性的内容。


0
投票

如果您的问题是[TestMethod]的断言,您可以使用http://www.fluentassertions.com从断言中排除每个ExtensionData属性。

例如。

objToCheck.ShouldBeEquivalentTo(expectedObj, options => options.Excluding(o => o.ExtensionData));

0
投票

您的类不应继承IExtensibleDataObject。

请参阅下面的Round-tripping说明:

当数据从新版本传输到旧版本并传输到新版本的数据协定时,会发生往返。旁路可确保不会丢失任何数据。关闭旁路使前面的类型与合同版本模型支持的任何未来更改兼容。

要为特定类型启用跳闸,应该执行类型

IExtensibleDataObject

接口。

用户界面包含ExtensionData(ExtensionDataObject)属性。该属性存储当前版本未知的数据协定的未来版本中的任何信息。


-1
投票

用[ServiceBehavior(IgnoreExtensionDataObject = true)]装饰你的ServiceImplementation

[ServiceBehavior(IgnoreExtensionDataObject=true)]
public class Service : IService {}
© www.soinside.com 2019 - 2024. All rights reserved.