首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataContract问题

DataContract问题
EN

Stack Overflow用户
提问于 2012-08-15 00:44:49
回答 2查看 809关注 0票数 2

我需要开发一个webservice,它将通过SOAP向java客户机公开。我们有一个定义良好的模式,我们使用它在两个系统之间进行通信。现在,我需要在我的WCF合同上公开一个操作,它接受Schema对象并将它存储在我们的DB中。

我按照以下步骤开发了webservice。

  • 在wcf中通过basichttp托管它
  • 使用xsd.exe创建模式的对象模型
  • 将模式作为操作的参数,类似于DoThis(SchemaObject模式)

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

为此,我已经在每个类上定义了DataContract吸引符,并向其添加了名称空间,该名称空间已经存在于XmlTypeAttribute中。此外,我还向每个属性添加了DataMemebers。

模式中的一些属性是数组,这些数组是由工具使用xmlarrayitem属性定义的。

现在,当我使用SOAP发送请求时,对象并不像预期的那样被反序列化。几乎所有的字段都是null,它具有某种继承层次结构。我已经将KnownType属性添加到适当的数据域,但仍然无法工作。

我的问题是:

  • 这是开发way服务的正确方法吗。
  • 是否有一种方法可以避免放置数据域和数据成员,而不需要使用xsd工具添加的序列化属性?
  • 是否有必要使用数据域属性,因为在xml反序列化的情况下,它不会与xml序列化属性一起工作吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-15 01:53:07

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

XSD.exe生成具有所有必要XmlSerializer属性的强类型实体。您不需要添加任何DataContractDataMemeber属性来处理WCF中生成的类。

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

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

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

如果您觉得需要更改自动生成的类,那么可以使用一组单元测试。这些测试用例应该生成不同的数据集,将它们序列化为XML,并检查XSD上的XML。

票数 1
EN

Stack Overflow用户

发布于 2012-08-15 06:11:14

从技术上讲,我不认为您实现服务的方式有任何特殊的缺陷。

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

  1. 制定一些特殊的“运输”方案,最大限度地使其平坦。当您的模型更改时,它使服务的更改更容易。而且,生成和处理xsd也减少了痛苦。
  2. 对通道两侧的特殊转换器进行编码,将正常模型转换为“平面”,反之亦然。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11962766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档