Ошибка десериализации XML в .NET

У меня возникла ошибка при попытке десериализовать xml в класс в .NET. Я взял файл xml и создал из него xsd с помощью инструментов .net xsd. Затем я создал класс из xsd, созданного с помощью того же инструмента.

Я получаю это исключение: «Объект не может быть сохранен в массиве этого типа» и «В XML-документе есть ошибка (8, 144)». В этой строке в xml я получил это:

 <events>
        <event assist="" assistid="" extra_min="" id="21775794" minute="87"    player="O. Atia" playerid="" result="[0 - 1]" team="away" type="goal"/>
</events>

это сгенерированное свойство С#:

[System.Xml.Serialization.XmlArrayAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    [System.Xml.Serialization.XmlArrayItemAttribute("event", typeof(livescoreLeagueMatchEventsEvent), Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=false)]
    public livescoreLeagueMatchEventsEvent[][] events {
        get {
            return this.eventsField;
        }
        set {
            this.eventsField = value;
        }
    }

это код разбора:

XmlSerializer deserializer = new XmlSerializer(typeof(T));
using (XmlReader reader = XmlReader.Create(path))
{
    return (T)deserializer.Deserialize(reader);
}

Это сгенерированный xsd:

            <xs:element name="events" minOccurs="0" maxOccurs="unbounded">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="event" minOccurs="0" maxOccurs="unbounded">
                    <xs:complexType>
                      <xs:attribute name="assist" type="xs:string" />
                      <xs:attribute name="assistid" type="xs:string" />
                      <xs:attribute name="extra_min" type="xs:string" />
                      <xs:attribute name="id" type="xs:string" />
                      <xs:attribute name="minute" type="xs:string" />
                      <xs:attribute name="player" type="xs:string" />
                      <xs:attribute name="playerid" type="xs:string" />
                      <xs:attribute name="result" type="xs:string" />
                      <xs:attribute name="team" type="xs:string" />
                      <xs:attribute name="type" type="xs:string" />
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>

Я думал, что инструменты xsd создают правильную структуру классов, и думал, что она будет работать без каких-либо изменений в коде. Безуспешно пытался войти в метод десериализации сериализатора...


person radix    schedule 11.04.2015    source источник
comment
Что за авто сгенерировало? И, кстати, это свойство, а не тип... Глядя на ваш xml, это должен быть не двумерный массив, а одномерный массив. livescoreLeagueMatchEventsEvent[]   -  person furier    schedule 11.04.2015
comment
Я использовал команду xsd xmlfile.xml для создания xsd из моего xml, а затем команду xsd xsdfile.xsd /classes для создания класса c# с помощью инструмента определения схемы XML из командной строки.   -  person radix    schedule 11.04.2015
comment
Не могли бы вы показать XSD? Правилен ли многомерный массив в сгенерированном коде? (Я спрашиваю, потому что помню ошибку в xsd.exe, из-за которой в некоторых случаях было слишком много измерений массива. Сейчас не помню подробности.)   -  person nodots    schedule 11.04.2015


Ответы (3)


Я только что исправил свой xsd, который, как я понял, не соответствует моей спецификации xml. я изменил элемент контейнера «события», чтобы он был таким

 <xs:element name="events" minOccurs="0" maxOccurs="1"> 
 ..
 </xs:element>

и новое свойство в сгенерированном классе было то, что мне было нужно:

public livescoreLeagueMatchEvent[] events {
    get {
        return this.eventsField;
    }
    set {
        this.eventsField = value;
    }
}
person radix    schedule 11.04.2015

Должно быть так же просто, как это, глядя на пример кода, который вы нам показали...

[Serializable]
public class MyClass 
{
    [XmlArrayItem("event", IsNullable = false)]
    public LivescoreLeagueMatchEventsEvent[] events { get; set; }
}
person furier    schedule 11.04.2015

Вы столкнулись с известной ошибкой в ​​xsd.exe:
http://webservices20.blogspot.de/2010/02/net-wcf-bug-cannot-convert-type-to.html

Используйте один из следующих обходных путей:

  • Отредактируйте сгенерированный прокси-класс — удалите одно вхождение [].

  • Отредактируйте XSD, добавив фиктивный элемент <xs:element minOccurs="0" name="dummy" type="xs:string"/> под определением элемента event.

person nodots    schedule 11.04.2015