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?
Répondre
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.
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.
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; }
}
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. –
@ end-user: Définir 'SerializablePassword' définirait le même champ de sauvegarde que 'Password', donc obtenir' Password' fonctionnerait très bien. –
+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
Question XY typique. Pourquoi X? –
@Hans: Je pense que c'est la sécurité. –
FYI, le XML Serializer n'est pas lié à C#. Cela fait partie de .NET. –