2009-10-08 29 views
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; } 
} 

} 

當第一序列是如我期望(默認值的非串行化):爲什麼XMLSerializer的取基類的默認值屬性來序列

<?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將導致無法序列化此屬性,就好像應用了基類屬性的默認值一樣。 有人可以向我解釋這種行爲嗎? 有沒有人知道這個工作?

我的目標是非序列化默認值,但更改派生類的默認值。

回答

1

XmlSerializer似乎只得到第一個DefaultValueAttribute,我不幸認爲沒有直接的解決方法,你需要什麼。但是,您可以實施IXmlSerializable並自己做那種東西。

+0

不是一個好的選擇。特別是因爲這個bug是類獨立的,並且IXMLSerializable實現不會。是否可以重寫XMLSerializer而不重寫所有內容? – Ingo

相關問題