7
votes

Ignorer les propriétés sur les classes dérivées lors de l'utilisation XMLSerializer de .NET

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 [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>).

Lorsque j'applique 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>);
}


2 commentaires

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?


5 Réponses :


-1
votes

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.

Voir ce page MSDN a>, et recherchez l'exemple suivant: P>

[System.Xml.Serialization.XmlInclude( typeof( Derived ) )]
public class Base
{
    // ...
}


2 commentaires

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



-1
votes

Essayez ceci

  XmlSerializer serializer = new XmlSerializer(typeof(DynamicCart), new Type[]{typeof(ShoppingCart)});


0 commentaires

0
votes

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));
}


0 commentaires

1
votes

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


0 commentaires

0
votes

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

Le reste du code reste. Jetez un coup d'œil à une démo légèrement modifiée à le voir au travail .


0 commentaires