继承类的C#XmlSerializer顺序修饰符问题

继承类的C#XmlSerializer顺序修饰符问题,c#,xml-serialization,C#,Xml Serialization,本规范未给出建议的结果,因为元素顺序不符合规定: using System; using System.IO; using System.Xml.Serialization; namespace XmlSerializeTest { class Program { static void Main(string[] args) { SubClass test = new SubClass(); test.A = "

本规范未给出建议的结果,因为元素顺序不符合规定:

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>
默认.NET按以下顺序序列化数据成员:

  • 基类层次结构(从上到下,即最后的类实例)
  • 按字母顺序排列的无顺序属性的数据成员
  • 具有Order属性的数据成员(具有相同顺序的成员按字母顺序排列)
有关更多详细信息,请参阅

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

编辑/注释:
XmlSerializer和DataContractSerializer使用类似的顺序。除非您需要完全控制xml格式,否则我将使用DataContractSerializer。请参见此图。

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

  • 基类层次结构(从上到下,即最后的类实例)
  • 按字母顺序排列的无顺序属性的数据成员
  • 具有Order属性的数据成员(具有相同顺序的成员按字母顺序排列)
有关更多详细信息,请参阅

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

编辑/注释:

XmlSerializer和DataContractSerializer使用类似的顺序。除非您需要完全控制xml格式,否则我将使用DataContractSerializer。请看这个。

另一种方法是使用抽象属性,并将[XmlElement]属性附加到底层。所以,若B在基类中是抽象的,那个么您可以用[XmlElement]子类在子类中重写它。基类版本需要有[XmlIgnore]以避免重复。然后,所有可序列化属性都将位于子类中,并且它们将正确排序。(如果您需要基类也是可序列化的,那么您可能必须拉出一个公共超类,以便任何可序列化的类都没有可序列化的子类。)

另一种方法是使用抽象属性,并将[XmlElement]属性附加到底层。所以,若B在基类中是抽象的,那个么您可以用[XmlElement]子类在子类中重写它。基类版本需要有[XmlIgnore]以避免重复。然后,所有可序列化属性都将位于子类中,并且它们将正确排序。(如果您需要基类也是可序列化的,那么您可能必须拉出一个公共超类,以便任何可序列化的类都没有可序列化的子类。)

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