Serialization.XmlChoiceIdentifierAttribute

Иногда появляется необходимость создать сервис, который в SOAP сериализации имеет на одном и том же месте то один тег, то другой в зависимости от состояния объекта. Однако, если сделать все как написано в документации, код примера идет ниже, то можно получить совсем не то, что хотелось бы. Класс для WCF, реализованный в виде:
Copy Source | Copy HTML
  1. [System.SerializableAttribute()]
  2.     [System.Xml.Serialization.XmlTypeAttribute(Namespace = "https://blabla")]
  3.     public partial class ClassName
  4.     {
  5.         private string itemField;
  6.         private ItemChoiceType itemElementNameField;
  7.  
  8.         /// <remarks/>
  9.         [System.Xml.Serialization.XmlElementAttribute("Choose1", typeof(string), Order =  0)]
  10.         [System.Xml.Serialization.XmlElementAttribute("Choose2", typeof(string), Order =  0)]
  11.         [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemElementName")]
  12.         public string Item
  13.         {
  14.             get
  15.             {
  16.                 return this.itemField;
  17.             }
  18.             set
  19.             {
  20.                 this.itemField = value;
  21.             }
  22.         }
  23.  
  24.         /// <remarks/>
  25.         [System.Xml.Serialization.XmlElementAttribute(Order = 1)]
  26.         [System.Xml.Serialization.XmlIgnoreAttribute()]
  27.         public ItemChoiceType ItemElementName
  28.         {
  29.             get
  30.             {
  31.                 return this.itemElementNameField;
  32.             }
  33.             set
  34.             {
  35.                 this.itemElementNameField = value;
  36.             }
  37.         }
  38.     }
  39.  
  40.     [System.SerializableAttribute()]
  41.     [System.Xml.Serialization.XmlTypeAttribute(Namespace = "https://blabla", IncludeInSchema = false)]
  42.     public enum ItemChoiceType
  43.     {
  44.         Choose1,
  45.         Choose2,
  46.     }

Даст примерно следующюю структуру xsd, в которой вопреки нашей воли вида XmlIgnore дополнительное поле всетаки помещается в выдачу:
Copy Source | Copy HTML
  1. <xs:complexType name="ClassName">
  2. <xs:sequence>
  3. <xs:element name="itemElementNameField" type="tns:ItemChoiceType"/>
  4. <xs:element name="itemField" nillable="true" type="xs:string"/>
  5. </xs:sequence>
  6. </xs:complexType>
  7. <xs:element name="ClassName" nillable="true" type="tns:ClassName"/>
  8. <xs:simpleType name="ItemChoiceType">
  9. <xs:restriction base="xs:string">
  10. <xs:enumeration value="Choose1"/>
  11. <xs:enumeration value="Choose2"/>
  12. </xs:restriction>
  13. </xs:simpleType>

Решение этой проблемы кроектся в задании дефолтного сериалайзера при помощи тэга XmlSerializerFormatAttribute, выставляемого у медота интерфейса WCF сервиса. Не зная этого можно долго биться над появлянием лишнего в выдаче SOAP.

Тэги: Code


Добавить комментарий




biuquote
Loading



Кто я?

Программист. Я слежу за блогосферой и знаю, как будет развиваться интернет. Когда у меня есть время я даже прилагаю для этого усилия. Подробнее

Последние комментарии

  • Seaswarm against Mexican oil (3)
    V.exeR написал(а): Так вот откуда потом появятся водные роботы, как в� [Ещё]
  • Seaswarm against Mexican oil (3)
    Flashr написал(а): Видимо бактерии оказались не настолько хороши. Их � [Ещё]
  • Seaswarm against Mexican oil (3)
    aingerlj написал(а): Там же всё бактерии захавают, бложики так говорят. [Ещё]
  • Dubai - LiRu (3)
    Flashr написал(а): Официальное лицо уже подтвердило, что часть страни� [Ещё]
  • Dubai - LiRu (3)
    Егор написал(а): И кстати не только в Дубае, в Шарджи тоже... Подоз� [Ещё]
  • Dubai - LiRu (3)
    Егор написал(а): В марте такая же фигня показывалась и на вконтакте [Ещё]
  • deep-water.ru (20)
    Прохожий написал(а): Я не особо понял в чем там обвиняют, но сделал бы � [Ещё]
  • deep-water.ru (20)
    flashr написал(а): Проблем с хостингом теперь нет. Переехали уже. [Ещё]
  • deep-water.ru (20)
    Sivka написал(а): Если стоит проблема с хостингом, то отпиши в почту� [Ещё]
  • deep-water.ru (20)
    Flashr написал(а): Отмечу, что на странице детальной статистики - htt� [Ещё]
Topbot at FeedsBurner

Копирайт

Все мысли, высказанные в блоге, являются моим мнением и за это мнение меня никто не забанит! Кроме того, никто не имеет право копировать материалы блога без использования ctrl+C/V!

© Copyright 2008