2010-08-09 14 views
1

En d'autres termes, je souhaite que mes données soient stockées dans une seule classe: alimentez-les dans une classe, mais évitez qu'elles ne soient sauvegardées lors d'une opération de sérialisation. Quelle est la meilleure façon d'y arriver?XmlSerializer: Comment autoriser une propriété à désérialiser, puis l'empêcher de sérialiser?

+0

Question XY typique. Pourquoi X? –

+0

@Hans: Je pense que c'est la sécurité. –

+0

FYI, le XML Serializer n'est pas lié à C#. Cela fait partie de .NET. –

Répondre

0

Ok, j'ai essayé la suggestion return null;, mais cela ne fonctionne pas; il ne parvient pas à désérialiser. Cependant, voici une solution:

public List<Program> Programs 
{ 
    get 
    { 
     System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace(true); 
     for (int i = 0; i < stackTrace.FrameCount; i++) 
     { 
      if ("XmlSerializationWriterApplication".Equals(stackTrace.GetFrame(i).GetMethod().ReflectedType.Name)) 
      { 
       return null; 
      } 
     } 
     return programs; 
    } 
    set { programs = value; } 
} 

Bien que probablement pas très performant, il examine le StackTrace pour voir qui a appelé la get - et si elle est le sérialiseur/Writer, il ne retourne rien.

1

Si vous aimez le contrôle total sur le processus de sérialisation, vous pouvez implémenter l'interface ISerializable.

Implémentez également le constructeur spécial. J'ai voulu dire IXmlSerializable. Merci John.

2

La méthode la plus simple consiste à sérialiser une propriété qui exécute correctement Set mais renvoie toujours une valeur false fixe sur Get. Par exemple, si la propriété a été appelée Password, vous devez créer une propriété SerializablePassword qui correspond à la conception ci-dessus, sans sérialiser l'original.

modifier

Voici l'exemple d'Ani, formaté, avec un seul changement:

[XmlIgnore] 
public string Password { get; set; } 

[XmlElement("Password")] 
public string SerializablePassword 
{ 
    get { return null; } 
    set { Password = value; } 
} 
+0

Eh bien, oui, j'ai considéré cela. Cependant, si j'ai fait quelque chose comme get {return null; }, alors je ne pouvais pas accéder à la valeur en interne. –

+0

@ end-user: Définir 'SerializablePassword' définirait le même champ de sauvegarde que 'Password', donc obtenir' Password' fonctionnerait très bien. –

+2

+1 @ Steven: Quelque chose comme ça, si je comprends bien? Bonne idée, un peu un hack si .. :) [XmlIgnore] public string Mot de passe {get; } chaîne publique SerializablePassword { get {return null;} set {Mot de passe = valeur; } } – Ani