J'ai une classe de base avec une propriété virtuelle et un type dérivé qui remplace la propriété virtuelle. Le type peut être sérialisé à XML. Ce que j'essaie de faire est de ne pas persister la liste des articles de propriété lorsque l'objet est du type dérivé. Pour atteindre cette classe dérivée, la classe dérivée décore la propriété remplacée avec l'attribut Lorsque j'applique [xmlignore] code>. La propriété virtuelle de la classe de base n'applique pas l'attribut
xmlignore code>. Pour une raison quelconque, la liste des éléments est sérialisée chaque même lorsque l'objet est du type dérivé (
dynamiccart code>).
xmlignore code> attribut à la propriété virtuelle La classe de base La liste n'est pas sérialisée pour déposer. P>
public class ShoppingCart
{
public virtual List<items> Items{get; set;}
//and other properties
public void SerializeToXML (string filePath)
{
var xmlSerializer = new XmlSerializer(this.GetType());
textWriter = new System.IO.StreamWriter(filePath);
xmlSerializer.Serialize(textWriter, this);
textWriter.Flush();
textWriter.Close();
}
}
//A cart that is populated by algo based on parameters supplied by user. I have no need to
//persist the actual items across sessions.
class DynamicCart: ShoppingCart
{
[XmlIgnore]
public override List<items>{get;set;}
//and other properties
}
class Shop
{
ShoppingCart cart = new DynamicCart();
PopulateCart(cart);
cart.serializeToXML(<PATH TO FILE>);
}
5 Réponses :
Je suppose que vous devez déclarer le type dérivé dans la classe de base pour la sérialisation XML. Cela semble un peu stupide, mais est par spécification.
L'ajout de cet attribut à la classe n'a pas résolu le problème. Serializer a continué à sérialiser la liste <éléments> même si la propriété remplacée dans la classe dérivée avait [xmlignore] attribut. J'ai finalement fini; Supprimer la propriété excessive de la classe dérivée; et écrire la logique de sérialisation conditionnelle dans la classe de base pour appliquer l'attribut xmlignore si la classe dérivée est sérialisée.
Toute idée de la raison pour laquelle le sérialiseur n'honore pas l'attribut [xmlignore] de ma classe dérivée ??
Essayez ceci
XmlSerializer serializer = new XmlSerializer(typeof(DynamicCart), new Type[]{typeof(ShoppingCart)});
Je pense que votre sérialisateur utilise votre classe de base au lieu de la dérivée.
public void SerializeToXML(string filePath, Type type) { xmlSerializer = new XmlSerializer(type); textWriter = new System.IO.StreamWriter(filePath); xmlSerializer.Serialize(textWriter, this); textWriter.Flush(); textWriter.Close(); } class Shop { ShoppingCart cart= new DynamicCart(); PopulateCart(cart); cart.serializeToXML(<PATH TO FILE>, typeof(DynamicCart)); }
Vous pouvez le faire en ajoutant un DOIREDSériorialiser *** code> à la classe de base. Par exemple:
BASE:
<Base xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Sub">
<Prop>Value</Prop>
</Base>
SUB:
<Sub />
Si je comprends bien, ce que vous essayez de faire, c'est une conversion à perte de la classe de base également appelée Tranking (au moins en C ++).
Si vous pouvez vous permettre de transformer vos cours en Documents (qui est le cas, je crois), le code est assez simple, car vous pouvez utiliser le constructeur de copie synthétisé de la base. < / p> Le reste du code reste. Jetez un coup d'œil à une démo légèrement modifiée à le voir au travail . P> P>
Il semble que vous avez répondu à la question vous-même.
J'ai mis en place un travail autour, mais pas une réponse à ma question, pourquoi le XMLSerializer n'honore pas l'attribut [xmlignore] dans la classe Serued et inclure la liste objet lorsque je serialise dynamiccart?