【问题标题】:Deserialization of XMLXML的反序列化
【发布时间】:2016-08-06 05:49:20
【问题描述】:

尝试反序列化 XML 日志文件。并且除了 XML Document(0,0) 中的错误之外似乎什么也得不到。我猜这与我的班级有关,但我似乎找不到解决方案。我无法更改 XML 格式,因为这是来自服务器的日志文件(只是简化)

XML

<?xml version="1.0" encoding="utf-8"?>
<POSLog>
<Transaction>
  <RetailStoreID>1</RetailStoreID>
  <SequenceNumber>2</SequenceNumber>
</Transaction>
<Transaction>
  <RetailStoreID>1</RetailStoreID>
  <SequenceNumber>3</SequenceNumber>
</Transaction>
</POSLog>

[Serializable()]
public class Transaction
{
    [XmlElement("RetailStoreID")]
    public string RetailStoreID { get; set; }

    [XmlElement("SequenceNumber")]
    public string SequenceNumber { get; set; }

}

[Serializable()]
[XmlRoot("POSLog")]
public class POSLog
{
    [XmlArray("POSLog")]
    [XmlArrayItem("Transaction", typeof(Transaction))]
    public Transaction[] Transaction { get; set; }
}

反序列化代码

POSLog poslog = new POSLog();
string path = "POSLog.xml";
XmlSerializer serializer = new XmlSerializer(typeof(POSLog));
StreamReader reader = new StreamReader(path);
poslog = (POSLog)serializer.Deserialize(reader);

通过从 StreamReader 切换到 FileStream 以及对类的更改找到了修复。使用 StreamReader 时更改编码似乎没有帮助。

【问题讨论】:

  • 1)需要内部异常,2)(题外话)你使用的属性有点太多了。
  • 显示堆栈跟踪,尤其是整个异常(内部异常)。
  • 由于错误位于 (0,0),即第一行的第一个字符,我猜这是因为您的 XML 文件是使用带有字节顺序标记的 UTF 编码的。尝试将编码添加到您的 StreamReader。
  • 如果您对 XML 文件执行 File.ReadAllBytes(),文件中的前 20 个左右字节是多少?

标签: c# xml


【解决方案1】:

我无法重现您看到的问题。但是,POSLog 类存在一个问题——它需要定义如下:

[Serializable()]
[XmlRoot("POSLog")]
public class POSLog
{
    [XmlElement("Transaction")]
    public Transaction[] Transaction { get; set; }
}   

您的 XML 有一个根元素 &lt;POSLog&gt;,其中包含 &lt;Transaction&gt; 元素的重复序列。 [XmlElement("Transaction")] 将数组映射到这样一个单级重复序列。

例如fiddle

【讨论】:

    【解决方案2】:

    将班级更改为上述答案

    [Serializable()]
    [XmlRoot("POSLog")]
    public class POSLog
    {
        [XmlElement("Transaction")]
        public Transaction[] Transaction { get; set; }
    }   
    

    连同更改以下 StreamReader 行

    StreamReader reader = new StreamReader(path);
    poslog = (POSLog)serializer.Deserialize(reader);
    

    到这里:

    FileStream fs = new FileStream(path, FileMode.Open);
    poslog = (POSLog)serializer.Deserialize(fs);
    

    修复了我在使用根元素时遇到的问题,并且我能够反序列化 XML。感谢 dbc 帮助我第一次在论坛中开始解决解决方案!

    【讨论】:

      猜你喜欢
      • 2012-03-04
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多