首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xamarin中XML的反序列化

Xamarin中XML的反序列化
EN

Stack Overflow用户
提问于 2017-02-04 12:24:55
回答 1查看 2.4K关注 0票数 1

我试图反序列化一个名为CSound的类

代码语言:javascript
复制
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

代码语言:javascript
复制
<?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正在尝试使用这一节代码反序列化

代码语言:javascript
复制
   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文档中有一个错误。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( 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=''

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-04 13:11:37

您的问题是,如果您试图序列化类型为List<CSounds>的根对象,您将得到如下所示的XML:

代码语言:javascript
复制
<ArrayOfCSound>
  <CSound>
    <id>one</id>
  </CSound>
</ArrayOfCSound>

注意,根元素<ArrayOfX>与嵌套的item元素<X>以相同的字符串X结尾?这与示例XML不一致,其中根元素名为ArrayOfSound,而item元素名为CSound

要解决这种不一致性,您需要引入根类型如下:

代码语言:javascript
复制
[XmlRoot("ArrayOfSounds")]
public class CSoundsRoot
{
    public CSoundsRoot() { this.Sounds = new List<CSound>(); }

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

那就做:

代码语言:javascript
复制
XmlSerializer serializer = new XmlSerializer(typeof(CSoundsRoot))
var root = (CSoundsRoot)serializer.Deserialize(reader);
var sounds = root == null ? new List<CSounds>() : root.Sounds;

另外,XML反序列化中的bug通常可以通过序列化您的类型并将观察到的XML与预期的XML进行比较来判断。

样品小提琴.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42040325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档