DataContract问题

时间:2012-08-15 00:44:49

标签: c# wcf

我需要开发一个Web服务,它将通过SOAP公开给Java客户端。我们有一个定义良好的模式,我们用它来在两个系统之间进行通信。现在我需要在我的WCF合约上公开一个操作,它接受Schema对象并将其存储在我们的DB中。

我已经按照以下方式开发了webservice。

  • 在wcf
  • 中将它托管在basichttp上
  • 使用xsd.exe
  • 创建架构的对象模型
  • 将模式作为DoThis(SchemaObject模式)
  • 等操作的参数

由于这将在WCF中公开,我已经去修改了xsd工具生成的对象模型。我们的模式具有多层嵌套,并且是4个不同模式链接在一起的组合。 xsd工具生成的对象图有抽象类,继承等。

为了实现这个目的,我已经去了,并在每个类上定义了DataContract attrbute,并在其中添加了名称空间,它已经存在于XmlTypeAttribute中。我还为每个属性添加了DataMemebers。

架构中的某些属性是由使用xmlarrayitem属性的工具定义的数组。

现在,当我使用SOAP UI发送请求时,该对象未按预期反序列化。几乎所有字段都是null,具有某种继承层次结构。我已将KnownType属性添加到相应的datacontracts,但仍无效。

我的问题是:

  • 这是开发网络服务的正确方法。

  • 有没有办法避免放置datacontract和数据成员,只是使用xsd工具添加的序列化属性?

  • 是否有必要使用datacontract属性,它是否不适用于xmlserialization属性,因为它适用于xml反序列化的情况?

2 个答案:

答案 0 :(得分:1)

WCF支持两种类型的序列化 - DataContractSerializerXmlSerializer

XSD.exe生成具有所有必需XmlSerializer属性的强类型实体。您无需添加任何DataContractDataMemeber属性即可在WCF中使用生成的类。

有关详细信息,请参阅MSDN - http://msdn.microsoft.com/en-us/library/ms733901.aspx

对xsd.exe生成的实体也要非常小心。正如您可能已经看到的那样,WCF服务器会在这些文件中进行许多序列化更改,但这会对客户端进行更改,因为它们会在XSD上进行中继。

如果可能的话,我会保留这些自动生成的实体而不进行任何更改,以保证接口不会被破坏。您可以引入单独的DTO类以在Business Layer中使用。您可以在那里实现继承层次结构。

如果您认为需要更改自动生成的类,

单元测试可以提供帮助。这些测试用例应该生成不同的数据集,将它们序列化为XML并通过XSD检查XML。

答案 1 :(得分:0)

从技术上讲,我没有看到您实施该服务的方式存在任何特殊缺陷。

但从架构的角度来看,这对我来说太复杂了。发送' flat '数据结构并在其他地方隐藏复杂性总是更容易。 我建议采取以下步骤

  1. 开发一些特殊的“运输”方案,最大限度地平整它。当您的模型发生变化时,它可以更轻松地更改服务。而且,生成和处理xsd也不那么痛苦。
  2. 对通道两侧的特殊转换器进行编码,将正常模型转换为“平坦”,然后反之亦然。