C# Xml反序列化错误

4
我是 .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]中导入类型映射,在System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping (System.Type type, System.Xml.Serialization.XmlRootAttribute root, System.String defaultNamespace) [0x00048]中导入类型映射,在System.Xml.Serialization.XmlSerializer..ctor (System.Type type, System.Xml.Serialization.XmlAttributeOverrides overrides, System.Type[] extraTypes, System.Xml.Serialization.XmlRootAttribute root, System.String defaultNamespace) [0x00041]中构造XmlSerializer,在System.Xml.Serialization.XmlSerializer..ctor (System.Type type) [0x00000]中构造XmlSerializer,在C:\Users\TEKINHP\source\repos\FimaksApp\Fmkt44\Fmkt44\icerik.xaml.cs:83中反序列化。
[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 - Marc Gravell
1个回答

3
错误信息如下:

因为其保护级别,REPORTLIST不可访问。只有公共类型可以被处理。

请将类型设置为public。因为XmlSerializer无法处理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; }
}

谢谢。我没有想到那会这么简单。 - Tekin Güllü

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接