XmlSerializer définir la valeur par défaut
Nous avons un document xml avec certains paramètres de l'utilisateur. Nous venons d'ajouter un nouveau paramètre (ce qui n'est pas trouvé dans l'héritage des documents xml) et l' XmlSerializer
définit automatiquement à false
.
J'ai essayé DefaultValueAttribute
mais ça ne fonctionne pas. Aucune idée sur comment je peux obtenir la valeur par défaut pour être true
? C'est le code:
private bool _property = true;
[DefaultValueAttribute(true)]
public bool Property
{
get { return _property; }
set
{
if (_property != value)
{
_property = value;
this.IsModified = true;
}
}
}
Merci!
OriginalL'auteur Carlo | 2011-09-03
Vous devez vous connecter pour publier un commentaire.
DefaultValue affecte la sérialisation d'autant que si lors de l'exécution, la propriété a une valeur qui correspond à ce que la Valeur par défaut, le XmlSerializer ne sera pas à l'écriture de cet élément (puisque c'est la valeur par défaut).
Je n'étais pas sûr de savoir si il serait alors affecter la valeur par défaut pour les lire, mais il n'apparaît pas de le faire dans un test rapide. Dans votre scénario, je serais probablement juste en faire une propriété avec une sauvegarde de champ avec un champ d'initialiseur qui fait "vrai". À mon humble avis, j'aime mieux que ctor approche car elle dissocie de la ctors vous n'avez ou n'avez pas défini pour la classe, mais c'est le même objectif.
Comme je l'ai mentionné dans un commentaire, la page sur les attributs de sérialisation xml (http://msdn.microsoft.com/en-us/library/83y7df3e.aspx) affirme que la Valeur par défaut sera en effet de faire le sérialiseur définir la valeur quand il est absent, mais il ne le fait pas dans ce test de code (comme ci-dessus, mais juste désérialise 3 entrées).
OriginalL'auteur James Manning
Indépendamment de la façon dont il est documenté pour le travail, j'ai aussi ne pas voir la Valeur par défaut affecté lors de la désérialisation. La solution pour moi a été tout simplement définir la valeur par défaut dans le constructeur de la classe et de l'abandonner sur DefaultValueAttribute.
OriginalL'auteur James
Sur Scott de la dernière réponse.
Le constructeur par défaut définit un tableau à la propriété "null" quand aucun élément n'est trouvé. J'ai mis la propriété à un nouveau tableau vide (donc, un exemple d'un tableau vide), mais le
XmlSerializer
contourne ce lors de sa désérialisation et il définit à "null".Exemple de la classe:
Il pourrait toutefois y avoir quelque chose de spécifique pour les tableaux, et votre réponse est toujours valable sur la définition de valeurs par défaut pour les propriétés simple dans le constructeur de la classe.
En tout cas, merci pour les réponses de tout le monde.
OriginalL'auteur Adeynack
Définir la valeur par défaut dans le constructeur. La valeur ne sera modifié au cours de désérialiser si elle existe dans le fichier.
OriginalL'auteur Daniel
La
DefaultValueAttribute
ne fait pas n'importe quoi pour l'exécution de votre code. C'est (principalement) utilisé par la propriété de navigateurs (comme lorsque vous liez votre objet à unPropertyGrid
) de savoir ce que la valeur par défaut devrait être de sorte qu'ils peuvent faire quelque chose de "spécial" lorsque la valeur est différente de celle par défaut. C'est ainsi que la propriété de la grille dans Visual Studio sait quand faire une valeur de gras (en montrant qu'elle est différente de la valeur par défaut.La
XmlSerializer
est le réglage de votre_property
champ defalse
parce que c'est l' .NET Framework valeur par défaut pour unbool
.La façon la plus simple d'accomplir ce serait probablement pour utiliser par défaut le constructeur de la classe et de définir la valeur.
J'ai voté parce que vous apporter un bon point sur la grille de propriété. Mais Le XmlSerializer coutures pour utiliser le DefaultValueAttribute aussi ce qui pourrait donner des maux de tête. Parfois, je veux une Valeur par défaut pour ma grille de propriété, mais encore envie de sérialiser ma valeur (en tout cas) pour s'assurer que tout changement à mon DefaultValue (dans le futur) serait laisser le code à exécuter en tant qu'auparavant.
OriginalL'auteur Scott Dorman