La sérialisation XML et DefaultValue(“”) liées problème en c#
ma classe de propriété a la valeur par défaut qui sera sérialiser.
public class DeclaredValue
{
[XmlElement(ElementName = "Amount", DataType = "double", IsNullable = false), DefaultValue(999)]
public double Amount { get; set; }
[XmlElement(ElementName = "Reference2", DataType = "string", IsNullable = false), DefaultValue("")]
public string Reference2 { get; set; }
}
nous avons donc créer une instance de DeclaredValue classe et de créer de la valeur pour Recommandations2 de la propriété et de ne pas affecter quoi que ce soit pour la Quantité. ainsi, lorsque nous sérialiser la classe DeclaredValue alors pas de balise trouvé pour montant dans mon xml. je mentionne la valeur par défaut pour la quantité "999", alors pourquoi il ne fonctionne pas dans la sérialisation. je veux que si ne pas affecter quoi que ce soit pour la quantité, puis amoun balise devrait être là dans mon xml avec la valeur par défaut.
pour ce faire, quoi j'ai besoin pour décorer la quantité de biens qu'elle vient toujours avec une valeur par défaut dans le format xml après la sérialisation si l'utilisateur ne pas affecter quoi que ce soit à cette propriété.
merci de me guider à ce que j'ai besoin de changer dans le code pour obtenir mon résultat souhaité.
OriginalL'auteur Mou | 2011-05-04
Vous devez vous connecter pour publier un commentaire.
Par la note sur MSDN:
Quelque peu surprenant, la Valeur par défaut ne réglemente que l'écriture d'un objet, les membres qui sont égales à leur Valeur par défaut ne sera pas écrit.
Vous devez toujours initialiser les membres avant ou après le chargement, vous-même, par exemple dans le constructeur.
Vous avez probablement besoin d'un constructeur pour définir les valeurs par défaut.
Le constructeur est appelé avant la désérialisation remplit les propriétés.
Juste pour confirmer, le réglage souhaité valeurs par défaut dans un constructeur travaille pour moi dans ce scénario.
la valeur par défaut est là pour dire le sérialiseur de ne pas écrire la valeur de retour lorsque vous enregistrez le fichier xml. Vous l'utiliser pour garder les configs claire des valeurs par défaut lors de la sérialisation. En utilisant une valeur par défaut le sérialiseur ne pourra le faire que pour un flux de données si la valeur actuelle n'est PAS la valeur par défaut. C'est pourquoi vous l'utilisez
OriginalL'auteur Henk Holterman
Permettez-moi de décrire minutieusement ce qui se passe.
Quand XmlSerializer Deserialize() la méthode est appelée, elle crée un nouvel objet à l'aide d'un constructeur par défaut. Il ne s'applique pas tout DefaultValueAttributes à cet objet, je beleave, en raison de l'hypothèse que par défaut ctor devrait "mieux connaître" comment initialiser les valeurs par défaut. De ce point de vue - c'est logique.
XmlSerializer n'est pas sérialiser les membres dont les valeurs sont les mêmes que marquée par la Valeur de l'attribut. D'un certain point de vue, un tel comportement est dicté par la logique de trop.
Mais quand vous ne pas initialiser membres dans ctor et appel désérialiser méthode, XmlSerializer vois pas de champ xml, mais il voit que le champ de la propriété a DefaultValueAttribute, sérialiseur il suffit de laisser une telle valeur (selon l'hypothèse que le constructeur par défaut sait mieux comment initialiser une classe "par défaut"). Et vous avez votre zéros.
Solution
Pour initialiser un des membres de la classe par ces DefaultValueAttributes (parfois, il est très pratique d'avoir cette initialisation des valeurs juste en place), vous pouvez utiliser une telle méthode simple:
Ce "public void LoadDefaults()", peut être décoré comme une Extension de l'objet ou de l'utilisation que certaines méthode statique d'une classe d'aide.
OriginalL'auteur MajesticRa
Comme Henk Holterman dit, cet attribut n'est pas défini, la valeur par défaut automatiquement. Son but est principalement utilisé par les concepteurs visuels pour réinitialiser une propriété à sa valeur par défaut.
Ce n'est pas clair? L'attribut n'a aucun effet. Vous avez juste besoin d'initialiser la propriété dans le constructeur.
OriginalL'auteur Thomas Levesque
Comme d'autres l'ont mentionné, le
DefaultValue
attribut ne pas initialiser la propriété. Vous pouvez utiliser une simple boucle pour définir toutes les propriétés:Même si
?.Value
pourrait revenirnull
, il fonctionne avec les types nullables, j'ai testé cette.Si seulement quelques-uns de vos propriétés ont une valeur par défaut, vous devriez peut-être seulement la valeur que si elle est là.
Si toutes les propriétés doivent avoir une valeur par défaut, supprimer la
?
pour obtenir une erreur si vous avez oublié un.Plus probable, les tableaux ne fonctionne pas, voir MajesticRa de la solution sur la manière de gérer cela.
OriginalL'auteur maf-soft