sur des types de valeur nullables lors de la sérialisation à XML - Retrouvez les réponses et les commentaires concernant cette question" />
J'ai ajouté des types de valeur nullables à ma classe sérialisable. J'effectue une série de sérialisation à l'aide de Y a-t-il un moyen d'éteindre cette option afin que rien ne soit émis lorsque le type de valeur est xmlSerializer code> mais lorsque la valeur est définie sur
null code>, je reçois un nœud vide avec
xsi: nil = "vrai" code>. C'est le comportement correct que j'ai trouvé sur XSI: NIL Attribute Binding Support A >. P>
null code>? p>
6 Réponses :
J'ai eu le même problème. Voici l'un des endroits que j'ai lus à propos de la manipulation de types de valeur nullables tout en sérialisant XML: http://stackoverflow.com/questions/2444953/serialize-A-Nullable-int-int Ils mentionnent à propos de l'utilisation de modèles intégrés, comme la création de propriétés supplémentaires pour des types de valeur nullables. comme pour une propriété nommée p> vous devez soit ajouter
Je n'étais que Serializing to XML à envoyer à un Proc stocké SQL, alors j'ai aussi évité de changer mes classes. Je fais un public bool devrait () {retour abc.hasvalue;} code>
ou public
bool abcspécifié {obtenir {retour abc.hasvalue; }} code> p>
[non (@xsi: nil)] code> Vérifiez tous les éléments nullables de ma requête .Value (). P> p>
Je mettez simplement une étape intermédiaire pour numériser le XML après avoir été sérialisé et supprimer tout XSI: nil = "vrai" code> nœuds.
J'ai trouvé que le public bool abcspécifié était le seul qui a fonctionné avec .NET 4.0. J'ai aussi dû ajouter le xmlignoreattribute
Voici ma solution complète pour supprimer une chaîne nommée ABC dans le fichier de référence Web de référence.cs: p>
Xmlignoreattribute sur une propriété "spécifiée" n'est pas nécessaire, ainsi que d'un setter sur la même propriété.
Toutes les méthodes méta comme spécifié em> ou devraient omettre em> est juste une mauvaise conception de programmation de la structure Microsoft .NET XML. Il devient encore plus compliqué si vous n'avez pas accès direct aux classes que vous souhaitez sérialiser. dans leur méthode de sérialisation, il ne devrait qu'ajouter un attribut comme "ignorenoulelable". P> My Solution actuelle Serialise le xml et ensuite supprime tous les nœuds ayant nil = "vrai" em> à l'aide de la fonction suivante. p>
C'est probablement la réponse la moins sophistiquée, mais je l'ai résolu pour moi avec une simple chaîne remplacer.
.replace ("XSI: nil = \" vrai \ "", ""); P>
Je suis sérialisé à la chaîne d'abord de toute façon. Je peux enregistrer dans le fichier plus tard. P>
Il garde toutes mes xmlwrittersetters intacts. Une autre solution que je l'ai trouvée, je l'ai trouvée.) P>
private static string Serialize<T>(T details) { var serializer = new XmlSerializer(typeof(T)); using (var ms = new MemoryStream()) { var settings = new XmlWriterSettings { Encoding = Encoding.GetEncoding("ISO-8859-1"), NewLineChars = Environment.NewLine, ConformanceLevel = ConformanceLevel.Document, Indent = true, OmitXmlDeclaration = true }; using (var writer = XmlWriter.Create(ms, settings)) { serializer.Serialize(writer, details); return Encoding.UTF8.GetString(ms.ToArray()).Replace(" xsi:nil=\"true\" ", ""); } } }
Je devais ajouter un oséraliser la méthode code> à chaque valeur nullable.
Je l'ai accompli de cette façon: