powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как сериализовать такой параметр XmlElementAttribute ?
4 сообщений из 4, страница 1 из 1
Как сериализовать такой параметр XmlElementAttribute ?
    #39339850
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

Пишу клиента к сервису. Сгенерировался такой тип:


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.1064.2")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://idecs.atc.ru/orderprocessing/ws/event/")]
public partial class OrderStatusEventStatusCode : object, System.ComponentModel.INotifyPropertyChanged {
        
  private object itemField;
        
  /// <remarks/>
  [System.Xml.Serialization.XmlElementAttribute("orgCode", typeof(string), Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
  [System.Xml.Serialization.XmlElementAttribute("techCode", typeof(long), Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
  public object Item {
            get {
                return this.itemField;
            }
            set {
                this.itemField = value;
                this.RaisePropertyChanged("Item");
            }
        }       
    }



Т.е. внутри orderStatusEvent может быть как строковый тэг orgCode, так и лонговый тэг techCode.

Как заполнить эту сущность, чтобы итоге сериализовалось в такой XML ?
Код: c#
1.
2.
3.
<statusCode>
  <techCode>7</techCode>
</statusCode>



Пытаюсь через анонимный тип:
Код: c#
1.
2.
3.
4.
Item = new OrderStatusEvent()
{
  statusCode = new OrderStatusEventStatusCode { Item = new { techCode  = 7} },
}



На OrderStatusEvent сериализатор не жалуется вроде. А вот на statusCode вылетает ошибка при вызове сервиса:
Код: c#
1.
Невозможно сериализовать <>f__AnonymousType0`1[System.Int32], т. к. он не имеет беспараметрического конструктора.
...
Рейтинг: 0 / 0
Как сериализовать такой параметр XmlElementAttribute ?
    #39339900
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот XSD кусок

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<xsd:element name="statusCode">
<xsd:complexType>
  <xsd:choice>
  
  <xsd:element name="orgCode" type="xsd:string">
    </xsd:element>

  <xsd:element name="techCode" type="xsd:string">
   </xsd:element>

  </xsd:choice>
</xsd:complexType>
</xsd:element>
...
Рейтинг: 0 / 0
Как сериализовать такой параметр XmlElementAttribute ?
    #39340014
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotek,
Если что то object то надоть сувать туды XmlElement нужной структуры для сериализации и вытаскивать XmlElement при десериализации и дальше разбирать вручную.
...
Рейтинг: 0 / 0
Как сериализовать такой параметр XmlElementAttribute ?
    #39340021
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил проблему. Нагулил как сериализовать xs:choise правильно и подправил сгенеренный код под это. Наверное можно было и автоматически сгенеренный код как-то правильно вызывать, но нашел только такое решение.

Переписал так

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.1064.2")]
    [System.SerializableAttribute()]
    [System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://idecs.atc.ru/orderprocessing/ws/event/", IncludeInSchema = false)]
    public enum ItemChoiceType
    {

        /// <remarks/>
        orgCode,

        /// <remarks/>
        techCode,
    }

    /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.1064.2")]
    [System.SerializableAttribute()]
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://idecs.atc.ru/orderprocessing/ws/event/")]
    public partial class OrderStatusEventStatusCode : object, System.ComponentModel.INotifyPropertyChanged
    {
        private string _item;

        private ItemChoiceType _itemElementName;

        [System.Xml.Serialization.XmlElementAttribute("orgCode", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
        [System.Xml.Serialization.XmlElementAttribute("techCode", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
        [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemElementName")]
        public string Item
        {
            get
            {
                return this._item;
            }
            set
            {
                this._item = value;
            }
        }

        [System.Xml.Serialization.XmlIgnoreAttribute()]
        public ItemChoiceType ItemElementName
        {
            get
            {
                return this._itemElementName;
            }
            set
            {
                this._itemElementName = value;
            }
        }

...  пропущен код RaisePropertyChanged
}



Тут интересно 2 момента:
1. "public string Item" вместо "public object Item"
Без этого при сериализации вставлялось
Код: xml
1.
<techCode xsi:type="xsd:int">7</techCode>


Вроде бы не критично (валидатор сервиса пропустил), но если описать элемент как строку, то вышло без этой приписки.

2. Form = System.Xml.Schema.XmlSchemaForm.Unqualified
Без этого при сериализации в элемент явно вставлялся неймспейс, что не проходило валидатор сервиса.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как сериализовать такой параметр XmlElementAttribute ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]