【问题标题】:When serializing/deserializing XML data, do the XML elements and the class attributes have the same name?序列化/反序列化 XML 数据时,XML 元素和类属性是否同名?
【发布时间】:2010-01-03 22:14:50
【问题描述】:

例如:

这是一个简单的类。

class Hero
{
    public string faction;
    public string name;
    public HeroType herotype;
}

这是对应的 XML。

<Hero>
    <android>
        <Faction>evil</Faction>
        <nombre>android</nombre>
    </android>
</Hero>

属性是否必须完全相同才能序列化信息?

我的主要目的是使用我的 XML 文件中的信息将信息“加载”到 Hero 类。

【问题讨论】:

    标签: c# xml serialization xml-serialization


    【解决方案1】:

    您可以使用 [XmlElement(...)] 来装饰您的字段以指定备用名称。它们也不必处于相同的顺序。但是您指定的 Xml 不适合您指定的类的结构。

    将您的 Xml 修改为以下内容:

    <Hero>
        <Name>android</Name>
        <Faction>evil</Faction>
        <HeroType>Agility</HeroType>
    </Hero>
    

    【讨论】:

      【解决方案2】:

      除非您另外指定(如 Aviad P. 所说,通过使用 [XmlElement()] 属性装饰属性),XML 中的名称将与属性名称完全匹配,反之亦然。

      排序应该是微不足道的。我说“应该”是因为它实际上是否 无关紧要取决于你如何设计你的课程。

      虽然一般来说让属性设置器没有副作用是一种很好的做法,但在处理 XML 反序列化时,它是必不可少的。在反序列化期间,属性将按照它们在 XML 中出现的顺序设置为其值。

      所以如果你有这个类:

      public class Test
      {
         private string _Foo;
         public string Foo { set { _Foo = value; _Baz="Foo"; } get { return _Foo; }}
      
         private string _Bar;
         public string Bar { set { _Bar = value; _Baz="Bar"; } get { return _Bar; }}
      
         private string _Baz;
         public string Baz { set { _Baz = value; } get { return _Baz; }}
      }
      

      然后Foo 出现在Bar 之前的XML 将Baz 设置为“Foo”,而Bar 出现在Foo 之前的XML 将Baz 设置为“Bar”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多