XmlSerializer InvalidOperationExc - известная проблема преобразования типов - PullRequest
3 голосов
/ 08 апреля 2011

Я использую XmlSerializer против сгенерированного класса XSD.EXE.

XmlSerializer serializer = new XmlSerializer(obj.GetType());

подбрасывает

InvalidOperationException Невозможно создать временный класс (результат = 1). ошибка CS0030: невозможно преобразовать тип itemOrderItemsItem [] для Ошибка itemOrderItemsItem CS0029: Невозможно неявно преобразовать тип itemOrderItemsItem для 'ItemOrderItemsItem []

Исправление (помечено <!--fix...--> ниже) говорит о добавлении некоторого глупого элемента в мою схему, но это не работает. Этому исправлению пять лет. Есть ли решение еще?

              <xs:sequence>
              <xs:element name="item" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="model" type="xs:string" minOccurs="0" />
                    <xs:element name="description" type="xs:string" minOccurs="0" />
                    <xs:element name="material" type="xs:string" minOccurs="0" />
                    <xs:element name="lot" type="xs:string" minOccurs="0" />
                    <xs:element name="serial" type="xs:string" minOccurs="0" />
                    <xs:element name="transferQty" type="xs:string" minOccurs="0" />
                    <xs:element name="shipQty" type="xs:string" minOccurs="0" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>     
            </xs:sequence>
       <xs:attribute name="tmp" type="xs:string" /><!--fix...-->

Ответы [ 2 ]

3 голосов
/ 11 сентября 2015

Это исправило это для меня, в файле xsd, где дочерний элемент имел maxOccurs = "unbounded". Я добавил дополнительную строку после </xs:sequence>:

<xs:attribute name="tmp" type="xs:string" />

, это известная проблема вКомпонент XmlSerializer Code Generation: он не может обрабатывать некоторые случаи вложенных неограниченных элементов.Созданная им объектная модель недопустима: пользователь не может использовать ее для создания XML-сообщений.

К сожалению, чтобы исправить это, необходимо отредактировать схему, чтобы убедиться, что все массивы-подобные конструкции будут обрабатываться правильно.Вам нужно будет немного изменить все конструкции схемы, которые имеют следующее:

<xs:sequence maxOccurs="unbounded">
  <xs:element ../>
<xs:sequence>

или

<xs:sequence>
  <xs:element maxOccurs="unbounded"/>
<xs:sequence>

Необходимо изменить (соответственно)

<xs:sequence maxOccurs="unbounded">
  <xs:element ../>
<xs:sequence>
<xs:attribute name="tmp" type="xs:string" /> <!--FIX LINE TO BE ADDED-->

или

<xs:sequence>
  <xs:element maxOccurs="unbounded"/>
<xs:sequence>
<xs:attribute name="tmp" type="xs:string" /> <!--FIX LINE TO BE ADDED-->
2 голосов
/ 08 апреля 2011

Если у вас есть XML вида

 <items>
    <item>
      <model>10</model>
      <description>Torque wrench</description>
      <material>100</material>
      <lot>3</lot>
      <serial></serial>
      <transferQty>1</transferQty>
      <shipQty></shipQty>
    </item>
    <item>
           //...
    </item>
    <item>
           //...
    </item>
  </items>

Xsd.exe сгенерирует xsd:

<xs:element name="items" minOccurs="0" maxOccurs="unbounded">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="item" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                      <xs:sequence>
                        <xs:element name="model" type="xs:string" minOccurs="0" />
                        <xs:element name="description" type="xs:string" minOccurs="0" />
                        <xs:element name="material" type="xs:string" minOccurs="0" />
                        <xs:element name="lot" type="xs:string" minOccurs="0" />
                        <xs:element name="serial" type="xs:string" minOccurs="0" />
                        <xs:element name="transferQty" type="xs:string" minOccurs="0" />
                        <xs:element name="shipQty" type="xs:string" minOccurs="0" />
                      </xs:sequence>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>

Тогда

xsd.exe "this.xsd" / c

Создает класс с двумерными массивами (items [] []). Я хотел только одномерный массив. Я изменил первую строку:

<xs:element name="items" minOccurs="0"><!--got rid of maxOccurs (which is what causes the issue)-->

Теперь это работает. Угадай сериализатор просто barfs на двухмерных массивах К счастью, они мне не нужны.

...