我使用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中刪除繼承的類型(將所有其他數組/集合類型保持不變),它就可以工作。 –