我使用Apache CXF和Aegis数据绑定为C#客户端提供Java Web服务。原则上这很有效。在C#方面,我想使用更有限的DataContractSerializer,因为它允许集合而不是数组。我明白使用DataContractSerializer会限制Aegis生成的WSDL的复杂性。现在我有一个使用继承的Java类型。 Aegis能够生成包含基本类型和派生类型的WSDL,但DataContractSerializer似乎无法理解此WSDL。 SvcUtil退回到XmlSerializer,并且我的集合获得了难看的数组。关闭CXF Aegis继承支持/使用继承与DataContractSerializer?
我能想象你的理论可能性来解决这个问题:
- 关闭继承支持,庇护。这应该会导致WSDL仅包含派生类型,其中包含所有基类型属性。
- 某种方式使DataContractSerializer的理解WSDL继承
- 某种方式使XmlSerializer的使用集合,而不是阵列
我觉得最后两个选项是不可能的,所以我坚持第一个。我如何关闭Aegis继承?
例WSDL片段:
<xsd:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://tables.basic.meona.de">
<xsd:complexType abstract="true" name="BaseTreeNode">
<xsd:sequence>
<xsd:element minOccurs="0" name="active" type="xsd:boolean"/>
<xsd:element minOccurs="0" name="category" type="xsd:boolean"/>
<xsd:element minOccurs="0" name="name" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="sequenceNumber" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
<xsd:complexType name="EmergencyDiagnosis">
<xsd:complexContent>
<xsd:extension base="ns0:BaseTreeNode">
<xsd:sequence>
<xsd:element minOccurs="0" name="externalCode" nillable="true" type="xsd:string"/>
<xsd:element minOccurs="0" name="favoriteDiagnosis" type="xsd:boolean"/>
<xsd:element minOccurs="0" name="identifier" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
看来宙斯盾以前的版本中并没有产生扩展,所以我希望它可以被关闭:https://issues.apache.org/jira/browse/CXF-5176
尝试在您的svcutil命令中添加'/ ct:System.Collections.Generic.List'1'开关来生成List <>集合,而不是阵列 –
非常感谢您的提示。不幸的是,这不起作用 - SvcUtil仍然回退到XmlSerializer,然后生成数组。如果我从WSDL中删除继承的类型(将所有其他数组/集合类型保持不变),它就可以工作。 –