我试图反序列化一个名为CSound的类
public class CSound
{
public string id { get; set; }
public string name { get; set; }
public string file { get; set; }
public string fav { get; set; }
}
..来自这个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文档中存在错误。
你能帮助我吗?
更新:
异常抛出此消息
[错误]致命的未处理异常:System.InvalidOperationException: XML文档中存在错误。 ---&GT; System.InvalidOperationException:不是 预期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 :(得分: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反序列化中的错误通常可以通过序列化您的类型并将观察到的XML与预期的XML进行比较来解释。
示例fiddle。