- Автор flashr от июня 22, 2010
Иногда появляется необходимость создать сервис, который в SOAP сериализации имеет на одном и том же месте то один тег, то другой в зависимости от состояния объекта. Однако, если сделать все как написано в документации, код примера идет ниже, то можно получить совсем не то, что хотелось бы. Класс для WCF, реализованный в виде:
Copy Source | Copy HTML- [System.SerializableAttribute()]
- [System.Xml.Serialization.XmlTypeAttribute(Namespace = "https://blabla")]
- public partial class ClassName
- {
- private string itemField;
- private ItemChoiceType itemElementNameField;
-
- /// <remarks/>
- [System.Xml.Serialization.XmlElementAttribute("Choose1", typeof(string), Order = 0)]
- [System.Xml.Serialization.XmlElementAttribute("Choose2", typeof(string), Order = 0)]
- [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemElementName")]
- public string Item
- {
- get
- {
- return this.itemField;
- }
- set
- {
- this.itemField = value;
- }
- }
-
- /// <remarks/>
- [System.Xml.Serialization.XmlElementAttribute(Order = 1)]
- [System.Xml.Serialization.XmlIgnoreAttribute()]
- public ItemChoiceType ItemElementName
- {
- get
- {
- return this.itemElementNameField;
- }
- set
- {
- this.itemElementNameField = value;
- }
- }
- }
-
- [System.SerializableAttribute()]
- [System.Xml.Serialization.XmlTypeAttribute(Namespace = "https://blabla", IncludeInSchema = false)]
- public enum ItemChoiceType
- {
- Choose1,
- Choose2,
- }
Даст примерно следующюю структуру xsd, в которой вопреки нашей воли вида XmlIgnore дополнительное поле всетаки помещается в выдачу:
Copy Source | Copy HTML- <xs:complexType name="ClassName">
- <xs:sequence>
- <xs:element name="itemElementNameField" type="tns:ItemChoiceType"/>
- <xs:element name="itemField" nillable="true" type="xs:string"/>
- </xs:sequence>
- </xs:complexType>
- <xs:element name="ClassName" nillable="true" type="tns:ClassName"/>
- <xs:simpleType name="ItemChoiceType">
- <xs:restriction base="xs:string">
- <xs:enumeration value="Choose1"/>
- <xs:enumeration value="Choose2"/>
- </xs:restriction>
- </xs:simpleType>
Решение этой проблемы кроектся в задании дефолтного сериалайзера при помощи тэга XmlSerializerFormatAttribute, выставляемого у медота интерфейса WCF сервиса. Не зная этого можно долго биться над появлянием лишнего в выдаче SOAP.
Тэги: Code