【问题标题】:C# Xml Deserializion errorC# Xml 反序列化错误
【发布时间】:2018-06-04 05:48:12
【问题描述】:

我是 .net 和 xamarin 的新手。我正在尝试开发一个 xamarin 表单应用程序。当我尝试反序列化我的 xml 时出现错误。

Error Message is  

在 System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping (System.Xml.Serialization.TypeData typeData, System.Xml.Serialization.XmlRootAttribute root, System.String defaultNamespace) [0x0013d] in :0 在 System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping (System.Type 类型,System.Xml.Serialization.XmlRootAttribute 根,System.String defaultNamespace)[0x00048] 在 :0 在 System.Xml.Serialization.XmlSerializer..ctor (System.Type 类型,System.Xml.Serialization.XmlAttributeOverrides 覆盖,System.Type[] extraTypes,System.Xml.Serialization.XmlRootAttribute 根,System.String defaultNamespace)[0x00041]在 :0 在 System.Xml.Serialization.XmlSerializer..ctor (System.Type 类型) [0x00000] 在 :0 在 C:\Users\TEKINHP\source\repos\FimaksApp\Fmkt44\Fmkt44\icerik.xaml.cs:83 中的 Fmkt44.icerik.Deserialize1 (System.String IasReturn) [0x00002]

[XmlRoot("REPORTLIST")]
[Serializable]
class REPORTLIST
{
    public REPORTLIST()
    {

    }       

    public List<ROW> ROW { get; set; }

}
[Serializable]
class ROW
{
    public ROW()
    {

    }
    public string INSTNUMBER { get; set; }
    public string MATERIAL { get; set; }

}

我的 xml 文件是

 <REPORTLIST>
     <ROW>
        <MATERIAL>A</MATERIAL>
        <INSTNUMBER>B</INSTNUMBER>
    </ROW>
 </REPORTLIST>

这是我的反序列化方法

    public static Stream GenerateStreamFromString(string s)
    {
        MemoryStream stream = new MemoryStream();
        StreamWriter writer = new StreamWriter(stream);
        writer.Write(s);
        writer.Flush();
        stream.Position = 0;
        return stream;
    }
    REPORTLIST Deserialize1(String MyXml)
    {
      XmlSerializer serializer = new XmlSerializer(typeof(REPORTLIST));
      return (REPORTLIST)serializer.Deserialize(GenerateStreamFromString(MyXml));

    }

serializer.Deserialize 发生错误

【问题讨论】:

  • 顺便说一句:你应该可以使用new StringReader(MyXml) 而不是GenerateStreamFromString

标签: c# xml xamarin deserialization


【解决方案1】:

错误信息是:

REPORTLIST 因其保护级别而无法访问。只能处理公共类型。

创建类型publicXmlSerializer 不能在 internal 类型上工作。另外:你不需要[Serializable] - XmlSerializer 不关心

您还需要在集合上使用[XmlElement],告诉它不要添加/期望包装元素。

最终工作版本:

[XmlRoot("REPORTLIST")]
public class ReportList
{
    [XmlElement("ROW")]
    public List<Row> Rows { get; } = new List<Row>();    
}
public class Row
{
    [XmlElement("INSTNUMBER")]
    public string InstNumber { get; set; }
    [XmlElement("MATERIAL")]
    public string Material { get; set; }
}

【讨论】:

  • 谢谢。没想到这么简单
猜你喜欢
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
  • 2010-10-17
相关资源
最近更新 更多