与继承的类的C#XmlSerializer订单装饰器问题

kno*_*ten 1 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 = "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; }
    } 
}
Run Code Online (Sandbox Code Playgroud)

它给出以下结果:

<BaseClass>
  <B>B</B>
  <A>A</A>
  <C>C</C>
</BaseClass>
Run Code Online (Sandbox Code Playgroud)

如何获得正确的订单(A,B,C)?

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

new XmlSerializer(typeof(BaseClass), new [] {typeof(SubClass)});
new XmlSerializer(typeof(SubClass), new [] {typeof(BaseClass)});
Run Code Online (Sandbox Code Playgroud)

小智 6

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

  • 基类层次结构(自上而下,即您的类实例最后)
  • 没有Order属性的数据成员按字母顺序
  • 具有Order属性的数据成员(具有相同顺序的成员产生字母顺序)

有关更多详细信息,请参见MSDN

如果您想要其他行为,则必须实现从XmlObjectSerializer继承的自己的数据序列化程序。-看一下这个帖子

编辑/注意:
XmlSerializer和DataContractSerializer使用类似的顺序。除非您需要完全控制xml格式,否则我将改用DataContractSerializer。请参阅此博客文章