2017-02-04 104 views
1

我试图反序列化一个名为CSound的反序列化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> 

T'm尝试使用这部分代码进行反序列化类

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>?其中根元素被命名为ArrayOfSound但该项目元素被命名为CSound这是你的示例XML不一致。

要解决这一矛盾,就需要引入一个根类型如下:

[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