2017-02-04 9 views
1

Я пытаюсь десериализацией класса с именем CsoundDeserialize XML в Xamarin

public class CSound 
{ 
    public string id { get; set; } 
    public string name { get; set; } 
    public string file { get; set; } 
    public string fav { get; set; } 
} 

..from это XML

<?xml version="1.0" encoding="utf-8" ?> 
<ArrayOfSounds xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <CSound> 
    <id>1</id> 
    <name>SampleName1</name> 
    <file>SampleFileName1</file> 
    <fav>true</fav> 
    </CSound> 
    <CSound> 
    <id>2</id> 
    <name>SampleName2</name> 
    <file>SampleFileName2</file> 
    <fav>false</fav> 
    </CSound> 
    <CSound> 
    <id>3</id> 
    <name>SampleName3</name> 
    <file>SampleFileName3</file> 
    <fav>true</fav> 
    </CSound> 
    <CSound> 
    <id>4</id> 
    <name>SampleName4</name> 
    <file>SampleFileName4</file> 
    <fav>false</fav> 
    </CSound> 
    <CSound> 
    <id>5</id> 
    <name>SampleName5</name> 
    <file>SampleFileName5</file> 
    <fav>true</fav> 
    </CSound> 
</ArrayOfSounds> 

Т'ми пытаются десериализации используя этот раздел кода

Assembly assembly = typeof(App).GetTypeInfo().Assembly; 
    Stream stream = assembly.GetManifestResourceStream("SaynarSounds.Resources.XML.Sounds.xml"); 

    List<CSound> sounds; 
    using (System.IO.StreamReader reader = new System.IO.StreamReader(stream)) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(List<CSound>)); 
     sounds = (List<CSound>)serializer.Deserialize(reader); 
    } 

    if (sounds == null) 
    { 
     sounds = new List<CSound>(); 
    } 

    return sounds; 

Найти ресурс и начать загрузку, но при десериализации Я получаю эту ошибку:

System.InvalidOperationException: в документе XML есть ошибка.

Вы можете мне помочь?

UPDATE:

исключение бросить это сообщение

[ERROR] FATAL UNHANDLED EXCEPTION: System.InvalidOperationException: There is an error in XML document. ---> System.InvalidOperationException: was not expected 02-04 12:29:58.045 E/mono-rt (3046): at System.Xml.Serialization.XmlSerializationReaderInterpreter.ReadRoot (System.Xml.Serialization.XmlTypeMapping rootMap) [0x0005b] in /Users/builder/data/lanes/3511/501e63ce/source/mono/mcs/class/System.XML/System.Xml.Serialization/XmlSerializationReaderInterpreter.cs:182 02-04 12:29:58.045 E/mono-rt (3046): at System.Xml.Serialization.XmlSerializationReaderInterpreter.ReadRoot() [0x00028] in /Users/builder/data/lanes/3511/501e63ce/source/mono/mcs/class/System.XML/System.Xml.Serialization/XmlSerializationReaderInterpreter.cs:87 02-04 12:29:58.045 E/mono-rt (3046): at System.Xml.Serialization.XmlSerializer.Deserialize (System.Xml.Serialization.XmlSerializationReader reader) [0x0001c] in /Users/builder/data/lanes/3511/501e63ce/source/mono/mcs/class/System.XML/System.Xml.Serialization/XmlSerializer.cs:364

Но у меня нет xmlns=''.

+0

Исключение обычно содержит положение искажения в документе. Обычно возникают проблемы с отсутствием или отсутствием байтового байта (BOM) в содержимом UTF8 –

ответ

1

Ваша проблема в том, что если вы попытаетесь сериализовать корневой объект типа List<CSounds> вы получите XML как следующее:

<ArrayOfCSound> 
    <CSound> 
    <id>one</id> 
    </CSound> 
</ArrayOfCSound> 

Обратите внимание, что корневой элемент <ArrayOfX> заканчивается в одной и той же строке X в качестве вложенного элемента элементы <X>? Это не соответствует вашему образцу XML, где корневой элемент имеет имя ArrayOfSound, но элементы элемента имеют имя CSound.

Чтобы обойти эту непоследовательность, вам нужно будет ввести тип корня следующим образом:

[XmlRoot("ArrayOfSounds")] 
public class CSoundsRoot 
{ 
    public CSoundsRoot() { this.Sounds = new List<CSound>(); } 

    [XmlElement("CSound")] 
    public List<CSound> Sounds { get; set; } 
} 

Затем сделайте:

XmlSerializer serializer = new XmlSerializer(typeof(CSoundsRoot)) 
var root = (CSoundsRoot)serializer.Deserialize(reader); 
var sounds = root == null ? new List<CSounds>() : root.Sounds; 

Как и в сторону, ошибки в XML десериализации часто может быть diagosed по сериализации вашего типа и сравнения наблюдаемого XML с ожидаемым XML.

Образец fiddle.