2
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" /> 

2番目の結果は次のとおりです。

<?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 は、新しいクラスを取得する代わりに、基本クラスの既定値を取得します。"override" で仮想プロパティをオーバーライドすると、同じ結果が得られます。ExData のプロパティ A の初期化を 10 に変更すると、基本クラス プロパティの既定値が適用されているかのように、このプロパティはシリアル化されません。誰かが私にこの振る舞いを説明できますか? 誰もこれに対する回避策を知っていますか?

私の目的は、デフォルト値を非シリアル化することですが、派生クラスのデフォルト値を変更することです。

4

1 に答える 1

1

XmlSerializer残念ながら、必要なものに対するDefaultValueAttribute直接的な回避策はないと思います。IXmlSerializableただし、そのようなことを自分で実装して実行することはできます。

于 2009-10-08T08:47:08.773 に答える