我需要开发一个webservice,它将通过SOAP向java客户机公开。我们有一个定义良好的模式,我们使用它在两个系统之间进行通信。现在,我需要在我的WCF合同上公开一个操作,它接受Schema对象并将它存储在我们的DB中。
我按照以下步骤开发了webservice。
由于这将在WCF中公开,我已经去修改了xsd工具生成的对象模型。我们的模式有多个层次的嵌套,并且是4个不同模式的组合在一起。由xsd工具生成的对象图具有抽象类、继承性等。
为此,我已经在每个类上定义了DataContract吸引符,并向其添加了名称空间,该名称空间已经存在于XmlTypeAttribute中。此外,我还向每个属性添加了DataMemebers。
模式中的一些属性是数组,这些数组是由工具使用xmlarrayitem属性定义的。
现在,当我使用SOAP发送请求时,对象并不像预期的那样被反序列化。几乎所有的字段都是null,它具有某种继承层次结构。我已经将KnownType属性添加到适当的数据域,但仍然无法工作。
我的问题是:
发布于 2012-08-15 01:53:07
WCF支持两种类型的序列化- DataContractSerializer和XmlSerializer。
XSD.exe生成具有所有必要XmlSerializer属性的强类型实体。您不需要添加任何DataContract或DataMemeber属性来处理WCF中生成的类。
有关详细信息,请参阅MSDN - http://msdn.microsoft.com/en-us/library/ms733901.aspx。
对于由xsd.exe生成的实体,也要非常小心。正如您可能已经看到的,WCF服务器将吃掉您可以在这些文件中进行的许多序列化更改,但这将破坏客户端的更改,因为它们是在XSD上进行的。
如果可能的话,我将保留这些自动生成的实体,不进行任何更改,以保证接口不会中断。您可以引入单独的DTO类,以便在业务层中使用。您可以在那里实现继承层次结构。
如果您觉得需要更改自动生成的类,那么可以使用一组单元测试。这些测试用例应该生成不同的数据集,将它们序列化为XML,并检查XSD上的XML。
发布于 2012-08-15 06:11:14
从技术上讲,我不认为您实现服务的方式有任何特殊的缺陷。
但从建筑的角度看,这对我来说太复杂了。发送“平面”数据结构和将复杂性隐藏在其他地方总是更容易。我建议采取以下步骤
https://stackoverflow.com/questions/11962766
复制相似问题