【问题标题】:C# XmlSerializer Order decorator issue with inherited class继承类的 C# XmlSerializer 订单装饰器问题
【发布时间】:2014-02-19 11:48:51
【问题描述】:

此代码未给出建议的结果,因为元素的顺序未按指定显示:

using System;
using System.IO;
using System.Xml.Serialization;

namespace XmlSerializeTest
{
    class Program
    {
        static void Main(string[] args) {
            SubClass test = new SubClass();
            test.A = "A";
            test.B = "B";
            test.C = "C";

            XmlSerializer SerializerObj = new XmlSerializer(typeof(SubClass));
            TextWriter WriteFileStream = new StreamWriter(@"C:\test.xml");
            SerializerObj.Serialize(WriteFileStream, test);
            WriteFileStream.Close();
        }
    }

    [Serializable()]
    public class BaseClass {
        [XmlElement(Order = 2)]
        public string B { get; set; }
    } 

    [Serializable()]
    public class SubClass : BaseClass {
        [XmlElement(Order = 1)]
        public string A { get; set; }
        [XmlElement(Order = 3)]
        public string C { get; set; }
    } 
}

它给出了这个结果:

<BaseClass>
  <B>B</B>
  <A>A</A>
  <C>C</C>
</BaseClass>

怎样才能得到正确的顺序(A、B、C)?

我也尝试过这些替代方法:

new XmlSerializer(typeof(BaseClass), new [] {typeof(SubClass)});
new XmlSerializer(typeof(SubClass), new [] {typeof(BaseClass)});

【问题讨论】:

    标签: c# xml-serialization


    【解决方案1】:

    默认的 .NET DataContractSerializer 按以下顺序序列化数据成员:

    • 基类层次结构(从上到下,即最终的类实例)
    • 不带 Order 属性的数据成员按字母顺序排列
    • 具有Order属性的数据成员(具有相同顺序的成员产生字母顺序)

    详情请见MSDN。

    如果您想要不同的行为,您必须实现自己的数据序列化器,该数据序列化器继承自 XmlObjectSerializer。 - 看看这个post。

    编辑/注释:
    XmlSerializer 和 DataContractSerializer 使用类似的顺序。除非您需要完全控制您的 xml 格式,否则我会使用 DataContractSerializer。请看这个blog post。

    【讨论】:

      【解决方案2】:

      另一种方法是使用抽象属性,并将 [XmlElement] 属性附加到底层。因此,如果 B 在 BaseClass 中是抽象的,那么您可以在 SubClass 中使用 [XmlElement] 子类覆盖它。 BaseClass 版本需要有 [XmlIgnore] 以避免重复。然后所有可序列化的属性都在 SubClass 中,它们会正确排序。 (如果您需要 BaseClass 也可序列化,则可能必须提取一个公共超类,以便没有可序列化的类具有可序列化的子类。)

      【讨论】:

        猜你喜欢
        • 2022-01-18
        • 2014-07-30
        • 1970-01-01
        • 1970-01-01
        • 2011-03-23
        • 2011-11-20
        • 2023-04-09
        • 2014-03-07
        • 2018-04-17
        相关资源
        最近更新 更多