Я пытаюсь представить довольно сложный объект в виде XML через REST API (используя WCF).
Однако объект определяется файлом XSD, поэтому я создал классы с помощью инструмента xsd.exe. Проблема в том, что когда мой объект сериализуется в XML, атрибут (определенный в xsd) сериализуется в элемент. И я не понимаю, почему. В настоящее время я предполагаю, что мой xsd каким-то образом позволяет это, но я не могу сказать, почему. Я не делаю никакой пользовательской сериализации, я позволяю фреймворку справиться с этим.
Может ли кто-нибудь объяснить, почему это происходит и как контролировать такое поведение?
Вот часть из xsd, содержащая элемент и атрибут. Изменить: рассматриваемый атрибут — версия.
<xs:schema xmlns:b="http://some.namespace.com/" xmlns="http://someothernamespace.com/" elementFormDefault="qualified" targetNamespace="http://someothernamespace.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="JobPositionPosting.xsd" />
<xs:element name="Envelope">
<xs:complexType>
<xs:sequence>
<xs:element ref="Sender" />
<xs:element minOccurs="0" ref="TransactInfo" />
<xs:element maxOccurs="unbounded" ref="Packet" />
</xs:sequence>
<xs:attribute fixed="0.52" name="version" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
А вот и сгенерированный код.
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "<removed>")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://somenamespace.com", IsNullable = false)]
public partial class Envelope
{
/// <remarks/>
public Sender Sender;
/// <remarks/>
public TransactInfo TransactInfo;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("Packet")]
public Packet[] Packet;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute("version")]
public string version;
public Envelope()
{
this.version = "0.52";
}
}
А вот xml, возвращенный службой REST, то есть сериализованный объект.
<!-- (the rest o the xml is left out on purpose) -->
<Envelope>
<senderField i:nil="true"/>
<transactInfoField i:nil="true"/>
<versionField>0.52</versionField>
</Envelope>
Спасибо!
svcutil.exe
не поддерживает атрибуты XML, особенно настройкуuse="required"
. Толькоxsd.exe
позволяет это. Чтобы использоватьXmlSerializer
с WCF, вы можете указатьXmlSerializerFormat
атрибут класса. 08.08.2012