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

} 

Alors que la première sérialisation est que je pense (non sérialisation de valeur par défaut):Pourquoi est-ce XMLSerializer prendre DefaultValue attributs de classe de base pour sérialiser

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

les deuxièmes résultats dans:

<?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> 

De toute évidence, XmlSerializer prend la valeur par défaut de la classe de base au lieu de prendre la nouvelle. Surpasser une propriété virtuelle avec "override" donne le même résultat. La modification de l'initialisation de la propriété ExData A à 10 entraîne la non-sérialisation de cette propriété comme si la valeur par défaut de la propriété de la classe de base était appliquée. Quelqu'un peut-il m'expliquer ce comportement? Est-ce que quelqu'un connaît un travail à ce sujet?

Mon but est de ne pas sérialiser les valeurs par défaut mais de changer la valeur par défaut pour une classe dérivée.

Répondre

1

Le XmlSerializer semble obtenir seulement le premier DefaultValueAttribute et je pense malheureusement qu'il n'y a pas de solution de contournement directe à ce dont vous avez besoin. Vous pouvez cependant implémenter IXmlSerializable et faire ce genre de choses vous-même.

+0

Pas une bonne alternative. D'autant plus que ce bug est indépendant de la classe et qu'une implémentation IXMLSerializable ne le serait pas. Est-il possible de remplacer XMLSerializer à la place sans tout réécrire? – Ingo