gpt4 book ai didi

继承类的 C# XmlSerializer Order 装饰器问题

转载 作者:太空宇宙 更新时间:2023-11-03 19:09:39 26 4
gpt4 key购买 nike

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

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)});

最佳答案

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

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

请参阅MSDN了解更多详情。

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

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

关于继承类的 C# XmlSerializer Order 装饰器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21879598/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com