Nous avons un document XML avec certains paramètres utilisateur. Nous venons d'ajouter un nouveau paramètre (qui ne se trouve pas dans les documents XML hérités) et le merci! P> p> xmlSerializer code> définit automatiquement sur
false code>.
J'ai essayé
defaultvalueattribute code> mais cela ne fonctionne pas. Avez-vous une idée de la manière dont je peux obtenir la valeur par défaut pour être
true code>? Ceci est le code:
5 Réponses :
Le Le Le moyen le plus simple d'accomplir cela serait probablement d'utiliser un constructeur de classe par défaut et de définir la valeur là-bas. P> DefaultValueAttribute code> ne fait rien à votre code d'exécution. Il est (principalement) utilisé par les navigateurs de propriétés (tels que lorsque vous liez votre objet à un
PropertyGrid code>) pour savoir quelle devrait être la valeur par défaut afin de pouvoir faire quelque chose de "spécial" lorsque la valeur est différente de celle-ci que le défaut. C'est ainsi que la grille de propriété dans Visual Studio sait quand faire une valeur audacieuse (montrant qu'elle est différente de la valeur par défaut. P>
xmlSerializer code> est le réglage de votre
_property code> sur
FALSE code> car c'est la valeur par défaut .NET Framework pour un
BOOL < / code>. p>
Ce n'est pas vrai que cela ne fait rien au code de course. Sans la valeur par défaut, vous ne pouvez même pas désérialiser dans certains cas. Si vous regardez le Code généré . La valeur par défaut ne définit pas une valeur par défaut lorsque la désérialisation, qui est assez inutile. Cependant, cela provoque le code généré de sauter des éléments vides.
J'ai voté parce que vous apportez un bon point sur le PropertyGrid. Mais les coutures XMLSerializer pour utiliser la valeur par défautValueattribute également qui pourrait donner des maux de tête. Parfois, je veux une valeur de valeur par défaut pour mon propriétéGrid, mais je veux toujours sérialiser ma valeur (dans tous les cas) pour vous assurer que toute modification de mon défautValue (à l'avenir) laisserait exécuter le code comme précédemment.
Lors de la sérialisation, si la valeur correspond à l'attribut ou élément de code>, l'attribut ou l'élément ne sera pas sérialisé. Si c'est un élément, il s'agit en fait d'un bogue dans xmlSerializer code>, car un élément peut avoir vide contenu i>, mais ne doit pas être omis i>; Ce n'est que pas un bug lorsqu'il est omis si
minocurs = 0 code> dans le schéma XML.
DefaultValue affecte la sérialisation dans la mesure où l'exécution de la propriété a une valeur correspondant à ce que dit la valeur par défaut, alors le XMLSerializer n'écrira pas cet élément (car c'est la valeur par défaut).
Je n'étais pas sûr Qu'il affecterait alors la valeur par défaut sur lecture, mais cela ne semble pas le faire dans un test rapide. Dans votre scénario, je voudrais tout simplement en faire une propriété avec un champ de support avec un initialiseur de terrain qui le rend "vrai". IMHO, j'aime bien cela mieux que l'approche ctor puisqu'il le découle des ctors que vous faites ou que vous n'avez pas défini pour la classe, mais c'est le même objectif. P>
using System; using System.ComponentModel; using System.Xml.Serialization; using System.IO; class Program { private static string[] s_inputs = new[] { @"<?xml version=""1.0"" encoding=""utf-16""?> <Testing xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" />", @"<?xml version=""1.0"" encoding=""utf-16""?> <Testing xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema""> <SomeProperty /> </Testing>", @"<?xml version=""1.0"" encoding=""utf-16""?> <Testing xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema""> <SomeProperty>true</SomeProperty> </Testing>", }; static void Main(string[] args) { var serializer = new XmlSerializer(typeof(Testing)); foreach (var input in s_inputs) { using (StringReader reader = new StringReader(input)) { Testing instance = (Testing)serializer.Deserialize(reader); Console.WriteLine("Deserialized string \n{0}\n into instance with SomeProperty={1}", input, instance.SomeProperty); } } Console.ReadLine(); } } public class Testing { [DefaultValue(true)] public bool SomeProperty { get; set; } }
Vous avez raison, cela ne fonctionne pas. Ce qui a eu lieu, ce qui était de simplement définir la valeur par défaut dans le constructeur de classe comme suggéré dans les autres postes ci-dessous.
À propos de la dernière réponse de Scott.
Le constructeur par défaut Définit toute propriété de tableau sur "NULL" lorsque aucun élément n'est trouvé. J'ai défini la propriété sur un nouveau tableau vide (donc une instance d'un tableau vide), mais le Il peut toutefois être quelque chose de spécifique aux tableaux et que votre réponse est toujours valide sur la définition des valeurs par défaut aux propriétés simples du constructeur de la classe ". / p> Quoi qu'il en soit, merci pour les réponses à tous. P> p> xmlsérializer code> le contourne lors de sa désérialisation et la définit sur "NULL". P> < P> Exemple de la classe: p>
Les tableaux sont vraiment maladroits pour lire / écrire avec XML. Peut-être que s'il s'agit d'une matrice de taille fixe qui est allouée dans le constructeur, mais je me suis arrêté jusqu'à présent à l'aide de listes plutôt que des tableaux pour tout domaine qui est un xmelement, car ils fonctionnent simplement.
Peu importe la manière dont il est documenté pour fonctionner, je ne vois pas non plus de défautValue à être attribuée lors de la désérialisation. La solution pour moi a simplement été défini sur la valeur par défaut dans le constructeur de classe et abandonner le défautValueAttribute. P>
C'est une bonne solution à la valeur par défaut.
Si vous définissez une valeur par défaut sur un attribut et que l'attribut est manquant, cela fonctionne comme prévu. Si vous définissez une valeur par défaut sur un élément et que l'élément contenu i> est vide, cela fonctionne comme prévu; Toutefois, si l'élément est manquant i>, une valeur vide est attribuée sur la désérialisation. C'est un comportement XML standard, qui est assez inutile. La définition d'une valeur par défaut dans le constructeur est plus sensible.
Définissez la valeur par défaut dans le constructeur. La valeur ne sera changée que lors de la désérialisation si elle existe dans le fichier.
public class MySettingsClass { public MySettingsClass() { _property = true; } private bool _property = true; public bool Property { get { return _property; } set { if (_property != value) { _property = value; this.IsModified = true; } } } }