私は Apache CXF と Aegis データ バインディングを使用して、Java Web サービスを C# クライアントに提供しています。これは原則として非常にうまく機能します。C# 側では、より制限された DataContractSerializer を使用したいと考えています。これは、配列の代わりにコレクションを使用できるためです。DataContractSerializer を使用すると、Aegis で生成された WSDL の複雑さが制限されることを理解しています。これで、継承を使用する Java 型ができました。Aegis は基本型と派生型の両方を含む WSDL を生成できますが、DataContractSerializer はこの WSDL を理解できないようです。SvcUtil は XmlSerializer にフォールバックし、私のコレクションは醜い配列になります。
この問題に対処するための理論的な可能性を想像できます。
- Aegis での継承サポートをオフにします。これにより、WSDL には派生型のみが含まれ、それぞれにすべての基本型プロパティが含まれます。
- 何とか DataContractSerializer に WSDL 継承を理解させる
- どういうわけか、XmlSerializer が配列ではなくコレクションを使用するようにします
最後の 2 つのオプションは不可能だと思うので、最初のオプションで行き詰まっています。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>
Aegis の以前のバージョンでは拡張機能が生成されなかったようです。