Я использую Apache CXF с привязкой данных Aegis для предоставления веб-службы Java клиенту C#. Это работает в принципе очень хорошо. На стороне C# я хотел бы использовать более ограниченный DataContractSerializer, потому что он позволяет создавать коллекции вместо массивов. Я понимаю, что использование DataContractSerializer ограничивает сложность WSDL, созданного Aegis. Теперь у меня есть тип Java, который использует наследование. Aegis может генерировать WSDL, который содержит как базовый, так и производный тип, но DataContractSerializer, похоже, не способен понять этот WSDL. SvcUtil возвращается к XmlSerializer, и мои коллекции получают уродливые массивы.Отключите поддержку CXF Aegis Inheritance/Use Inheritance с DataContractSerializer?
Я могу представить тебя теоретические возможности для решения этой проблемы:
- Отключение поддержки наследования с Aegis. Это должно привести к тому, что 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>
кажется прежние версии Aegis не генерировали расширение, поэтому я надеюсь, что это может быть выключен: https://issues.apache.org/jira/browse/CXF-5176
Попробуйте добавить '/ ct: System.Collections.Generic.List'1' переключатель в команду svcutil для генерации списков <> коллекций вместо массивов –
Большое спасибо за ваш совет. К сожалению, это не сработает - SvcUtil все еще возвращается к XmlSerializer, который затем генерирует массивы. Если я удалю унаследованный тип из WSDL (оставив все мои другие типы массива/коллекции без изменений на месте), он будет работать. –