c# - XMLSerializer 为什么要取基类的 DefaultValue 属性来序列化

标签 c# xml-serialization overriding default-value derived-class

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

namespace SerializerTest {
    static class Program {
        static void Main() {
            using (TextWriter textWriter = new StreamWriter("data.xml")) {
                Data data = new Data();
                new XmlSerializer(typeof(Data)).Serialize(textWriter, data);
                textWriter.Close();
            }
            using (TextWriter textWriter = new StreamWriter("exData.xml")) {
                ExData exData = new ExData();
                new XmlSerializer(typeof(ExData)).Serialize(textWriter, exData);
                textWriter.Close();
            }
        }
    }

public class Data {
    [DefaultValue(10)] public int A { get; set; }
    public Data() { A = 10; }
}

public class ExData : Data {
    [DefaultValue(20)] public new int A { get; set; }
    public ExData() { A = 20; }
}

}

虽然第一次序列化如我所料(默认值的非序列化):

<?xml version="1.0" encoding="utf-8" ?> 
  <Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" /> 

第二个结果:

<?xml version="1.0" encoding="utf-8"?>
<ExData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <A>20</A>
</ExData>

显然,XmlSerializer 采用基类的默认值,而不是采用新值。使用“覆盖”覆盖虚拟属性会产生相同的结果。 将 ExData 的属性 A 的初始化更改为 10 会导致不序列化此属性,就好像应用了基类属性的默认值一样。 谁能向我解释这种行为? 有人知道解决这个问题的方法吗?

我的目标是非序列化默认值,但更改派生类的默认值。

最佳答案

XmlSerializer 似乎只获得第一个 DefaultValueAttribute,不幸的是,我认为没有直接的解决方法来满足您的需求。但是,您可以实现 IXmlSerializable 并自己完成此类操作。

关于c# - XMLSerializer 为什么要取基类的 DefaultValue 属性来序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1536354/

相关文章:

javascript - Sencha Extjs - 正确覆盖方法吗?

c# - 使用多对多 linq 数据填充类

c# - 经典 Windows 主题和 Aero 中 WPF 控件的大小

java - CouchDB:访问 _design View 或提取文档字段的替代方法是什么?

c# - ASMX Web 服务未序列化抽象基类

python 内置函数与魔术函数和覆盖

c# - 如何获取 Windows 服务登录用户的安全 token ?

c# - DbContext解耦

c# - 将具有关系的数据集转换为嵌套的 json

java - 为什么我不能覆盖 onConfigurationChanged(Configuration)?