c# - 无法将简单的 XML 解析为对象?

标签 c# xml xml-serialization xml-deserialization

XML

<MeterWalkOrder>
  <Name>Red Route</Name>
  <Meters>
    <Meter>
      <MeterID>1</MeterID>
      <SerialNumber>12345</SerialNumber>
    </Meter>
    <Meter>
      <MeterID>2</MeterID>
      <SerialNumber>SE</SerialNumber>
    </Meter>
  </Meters>
</MeterWalkOrder>

我无法使用任何序列化程序将简单的 XML 放入对象中

var xml = File.ReadAllText("WalkOrder.xml");
var xmlSerializer = new NFormats.Xml.XmlSerializer();
var obj = xmlSerializer.Deserialize<MeterWalkOrder>(new StringReader(xml));

我刚刚取回 2 米的对象,这些对象没有设置任何属性,并且名称甚至没有按行走顺序设置。

 public partial class MeterWalkOrder
 {
        public MeterWalkOrder()
        {
            Meters = new List<Meter>();
        }

        [DataMember]
        public String Name { get; set; }
     }
}

using System;
using System.Xml.Serialization;

namespace WindowsFormsApplication1.Classes
{    
    public class Meter : IMeter
    {
        [XmlAttribute]
        public int MeterID { get; set; }

        [XmlAttribute]
        public String SerialNumber { get; set; }
    }
}

我愿意尝试任何 xml 序列化程序。

最佳答案

首先我建议您阅读Introducing XML Serialization on MSDN 您犯了几个错误,导致运行代码时抛出未提及的异常。

  1. 在 Xml MeterID 和 SerialNumber 中,它们不是属性,而是元素。 (正如怀亚特·厄普评论的那样)
  2. 如果你想序列化某些东西,你必须告诉它应该是[Serializable]
  3. 序列化需要一个已实现的公共(public)空构造函数
  4. 在未关闭流时不要打开流(使用“using”)
  5. 要测试序列化效果是否最好,请先序列化,然后检查输出,然后实现反序列化

在下面找到一个完整的工作示例:

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace X123
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            MeterWalkOrder mo = new MeterWalkOrder();
            mo.Name = "name";
            mo.Meters.Add(new Meter { MeterID = 1, SerialNumber = "kdkdkd" });
            mo.Meters.Add(new Meter { MeterID = 2, SerialNumber = "holladrio" });

            var xmlSerializer = new XmlSerializer(typeof(MeterWalkOrder), new Type[] { typeof(Meter) });
            {
                xmlSerializer.Serialize(File.CreateText("hello.xml"), mo);
                using (Stream s = File.OpenRead("hello.xml"))
                {
                    var obj = xmlSerializer.Deserialize(s);
                }
            }
        }



    }

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

        public string Name { get; set; }
        public List<Meter> Meters { get { return meters; } set { meters = value; } }
        private List<Meter> meters = new List<Meter>();
    }

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

        [XmlAttribute]
        public int MeterID { get; set; }

        [XmlAttribute]
        public string SerialNumber { get; set; }
    }

关于c# - 无法将简单的 XML 解析为对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26257041/

相关文章:

c# - ASP.NET MVC View 编译失败

xml - 通过 XSLT 将输入 XML 复制到输出

c# - 如何序列化 List<object>

c# - 在文档根目录反序列化 XML 数组

java - XML 序列化真的与 XML 数据绑定(bind)不同吗?如果不同,又有何不同?

c# - 我不了解 volatile 和 Memory-Barrier 的是

C# - 组合学

java - 在java中进行xml转换和过滤

c# - 如何在 C# 中的页面加载期间向选择添加选项

java - JAXB 规范 : XmlAnyAttribute collision with explicit mapped attribute 是怎么说的