Sérialiser un nullable int
J'ai une classe avec un nullable int? type de données défini pour sérialiser comme un élément xml. Est-il possible de configurer de sorte que le sérialiseur xml ne sera pas sérialiser l'élément si la valeur est null?
J'ai essayé d'ajouter le bouton [System.Xml.La sérialisation.XmlElement(IsNullable=false)] attribut, mais je reçois un moteur d'exécution de sérialisation exception disant qu'il y avait une erreur, reflétant le type, parce que "IsNullable ne peut pas être réglé à 'false' pour un type Nullable. Pensez à utiliser le Système de la.Int32 de type ou de retrait de la IsNullable bien de la XmlElement attribut."
[Serializable]
[System.Xml.Serialization.XmlRoot("Score", Namespace = "http://mycomp.com/test/score/v1")]
public class Score
{
private int? iID_m;
...
///<summary>
///
///</summary>
public int? ID
{
get
{
return iID_m;
}
set
{
iID_m = value;
}
}
...
}
La classe ci-dessus va sérialiser à:
<Score xmlns="http://mycomp.com/test/score/v1">
<ID xsi:nil="true" />
</Score>
Mais pour les Id qui sont nuls je ne veux pas l'ID de l'élément à tous, principalement parce que lorsque j'utilise OPENXML dans MSSQL, elle retourne la valeur 0 au lieu de null pour un élément qui ressemble à
Vous devez vous connecter pour publier un commentaire.
XmlSerializer prend en charge la
ShouldSerialize{Foo}()
modèle, de sorte que vous pouvez ajouter une méthode:Il y a aussi le
{Foo}Specified
modèle ne sais pas si XmlSerializer prend en charge qu'un seul.HasValue
sur la propriété.Foo
vous avez également unpublic bool FooSpecified {get {...} set {...}}
, puis leget
est utilisé pour voir siFoo
devrait être sérialisé, et laset
est appelé lors de l'affectation d'une valeur àFoo
lors de la désérialisation.string
n'a pas besoin de ce modèle? I. e. si je n'ai pas de définir une propriété de type chaîne, il ne sera pas de sortie d'un élément XML, mais pour un float, je dois le déclarer comme nullable ET de mettre en œuvre ce modèle.J'utilise ce micro-modèle à mettre en œuvre Nullable de la sérialisation:
Ainsi, le droit de l'interface de l'utilisateur sans compromis et fait la bonne chose lors de la sérialisation.
J'ai trouvé une solution de contournement en utilisant deux propriétés. Un int? propriété avec un attribut XmlIgnore et une propriété de l'objet qui est sérialisée.
Wow merci à cette question/réponse m'a vraiment aidé à sortir. J'cœur Stackoverflow.
J'ai fait ce que vous faites au-dessus un peu plus générique. Tout ce que nous sommes vraiment à la recherche de est à ont Nullable légèrement différentes de sérialisation de comportement. J'ai utilisé un Réflecteur pour construire mon propre Nullable, et a ajouté quelques petites choses ici et là pour faire de la sérialisation XML travail de la façon dont nous voulons. Semble fonctionner assez bien:
Vous perdez la possibilité d'avoir vos membres, comme des int? et ainsi de suite (utiliser les valeurs null<int> au lieu de cela) mais d'autres que tout le comportement reste le même.
System.ExecutionEngineException
surXmlSerializer.Serialize
à moi.Malheureusement, les comportements que vous décrivez sont identifiées comme telles dans les docs pour XmlElementAttribute.IsNullable.
Très utile de poster été d'une grande aide.
J'ai choisi d'aller avec Scott révision à la Nullable(T) type de données, cependant le code affiché toujours sérialise le Nullable élément quand il est Nul - mais sans le "xs:nil= "true " attribut".
J'avais besoin de forcer le processus de baisse de la balise complètement j'ai donc tout simplement mis en œuvre IXmlSerializable sur la structure (ce qui est en VB, mais vous obtenez l'image):
Je préfère cette méthode à l'aide de l' (foo)modèle Spécifié en tant que nécessite l'ajout d'seau charge de la redondance des propriétés de mes objets, tandis que l'utilisation de la nouvelle type Nullable demande simplement de le retaper des propriétés.