2010-11-23 16 views
6

J'ai découvert que si un sérialisable Champ/Propriété a un champ correspondant de type booléenne ayant comme nom le Champ/Nom de la propriété avec le suffixe « spécifié », XmlSerializer exclut conditionnellement ce champ /propriété du processus de sérialisation. Agréable!XmlSerializer, le suffixe « spécifié » et IReflect

Donc, je veux éviter la définition de ces champs, et les ajouter dynamiquement lors de l'exécution ...

lecture this, j'ai trouvé une interface intéressante IReflect que je peux utiliser pour « imiter » champs dynamiques qui sont utilisés par les instances XmlSerializer pour exclure certains champs.

Est-ce que cela fonctionnerait?

+0

Pouvez-vous expliquer pourquoi vous voulez éviter les champs et le faire lors de l'exécution? Voulez-vous sérialiser les classes différemment en fonction de certaines valeurs calculées d'exécution, ou vous voulez simplement éviter d'ajouter ces propriétés supplémentaires? –

Répondre

2

Si vous voulez prendre le contrôle de votre sérialisation xml, vous avez deux options. La première (qui pourrait ne pas être appropriée ici) consiste à utiliser les attributs de l'espace de noms System.Xml.Serialization pour exclure les propriétés. Si vous avez vraiment besoin de déterminer ce qui est sérialisé lors de l'exécution, ce n'est peut-être pas la meilleure solution.

Voir Attributes That Control XML Serialization

L'autre façon de le faire est d'implémenter l'interface IXmlSerializable de votre classe et mettre en œuvre les méthodes ReadXML et WriteXml. Cela vous permet de contrôler exactement l'apparence de votre fichier XML. Voir cette question pour plus d'info:

custom xml serialization

Cependant, comme mentionné ici Mixing custom and basic serialization? une fois que vous mettre en œuvre IXmlSerializable vous êtes responsable de toute la logique de sérialisation pour votre type.

+0

s'il vous plaît ne pas poster des liens. NET 1.1 sauf demande explicite. –

+0

Merci d'avoir accepté la réponse. Hou la la! Je me suis juste rendu compte qu'il y a presque 1 an que j'ai répondu :-) –

2

Je vais étendre la réponse de Martin Peck. Vous pouvez éviter la sérialisation des champs/propriétés avec le suffixe "Spécifié". Vous devez définir les propriétés "* Specified" de votre classe et leur appliquer [XmlIgnoreAttribute()].

Voici un exemple:

[System.SerializableAttribute()] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://yournamespace.com")] 
public partial class YourObject 
{ 
    private long sessionTimeoutInSecondsField; 

    private bool sessionTimeoutInSecondsFieldSpecified; 

    public long sessionTimeoutInSeconds 
    { 
     get 
     { 
      return this.sessionTimeoutInSecondsField; 
     } 
     set 
     { 
      this.sessionTimeoutInSecondsField = value; 
     } 
    } 

    [System.Xml.Serialization.XmlIgnoreAttribute()] 
    public bool sessionTimeoutInSecondsSpecified 
    { 
     get 
     { 
      return this.sessionTimeoutInSecondsFieldSpecified; 
     } 
     set 
     { 
      this.sessionTimeoutInSecondsFieldSpecified = value; 
     } 
    } 
} 
+0

Vous obtenez l'utilisation seulement getter pour la propriété '* Specified» et n'avez pas besoin de mettre 'XmlIgnore'. – xmedeko