Ich habe eine Klasse mit einem nullbaren int? Datentyp, der als XML-Element serialisiert werden soll. Gibt es eine Möglichkeit, es so einzurichten, dass der XML-Serializer das Element nicht serialisiert, wenn der Wert null ist?
Ich habe versucht, das Attribut [System.Xml.Serialization.XmlElement (IsNullable = false)] hinzuzufügen, erhalte jedoch eine Laufzeit-Serialisierungsausnahme, die besagt, dass ein Fehler aufgetreten ist, der den Typ widerspiegelt, da "IsNullable möglicherweise nicht auf" false "gesetzt ist 'für einen Nullable-Typ. Verwenden Sie den Typ' System.Int32 'oder entfernen Sie die IsNullable-Eigenschaft aus dem 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;
}
}
...
}
Die obige Klasse wird serialisiert zu:
<Score xmlns="http://mycomp.com/test/score/v1">
<ID xsi:nil="true" />
</Score>
Aber für IDs, die null sind, möchte ich das ID-Element überhaupt nicht, vor allem, weil bei Verwendung von OPENXML in MSSQL für ein Element, das aussieht, eine 0 anstelle von null zurückgegeben wird
quelle
HasValue
auf dem Grundstück anrufen .Foo
auch ein habenpublic bool FooSpecified {get {...} set {...}}
, wird dasget
verwendet, um zu sehen, obFoo
es serialisiert werden soll, und dasset
wird aufgerufen, wennFoo
während der Deserialisierung ein Wert zugewiesen wird.Ich verwende dieses Mikromuster, um eine nullbare Serialisierung zu implementieren:
Dies bietet dem Benutzer die richtige Schnittstelle ohne Kompromisse und macht beim Serialisieren immer noch das Richtige.
quelle
Ich habe eine Problemumgehung mit zwei Eigenschaften gefunden. Ein int? Eigenschaft mit einem XmlIgnore-Attribut und einer Objekteigenschaft, die serialisiert wird.
quelle
Wow, danke, diese Frage / Antwort hat mir wirklich geholfen. Ich liebe Stackoverflow.
Ich habe das, was Sie oben tun, etwas allgemeiner gemacht. Alles, was wir wirklich suchen, ist Nullable mit etwas anderem Serialisierungsverhalten. Ich habe Reflector verwendet, um meine eigene Nullable zu erstellen, und hier und da ein paar Dinge hinzugefügt, damit die XML-Serialisierung so funktioniert, wie wir es wollen. Scheint ziemlich gut zu funktionieren:
Sie verlieren die Fähigkeit, Ihre Mitglieder als int zu haben? und so weiter (müssen stattdessen Nullable <int> verwenden), aber ansonsten bleibt das gesamte Verhalten gleich.
quelle
System.ExecutionEngineException
aufXmlSerializer.Serialize
mich an .Leider sind die von Ihnen beschriebenen Verhaltensweisen in den Dokumenten für XmlElementAttribute.IsNullable als solche genau dokumentiert.
quelle
Sehr nützliches Posting hat sehr geholfen.
Ich habe mich für Scotts Überarbeitung des Datentyps Nullable (Of T) entschieden, aber der veröffentlichte Code serialisiert das Nullable-Element immer noch, wenn es Null ist - allerdings ohne das Attribut "xs: nil = 'true'".
Ich musste den Serializer zwingen, das Tag vollständig zu löschen, also habe ich einfach IXmlSerializable in die Struktur implementiert (dies ist in VB, aber Sie erhalten das Bild):
Ich bevorzuge diese Methode gegenüber der Verwendung des (foo) angegebenen Musters, da dies das Hinzufügen von Bucket-Lasten redundanter Eigenschaften zu meinen Objekten erfordert, während die Verwendung des neuen Nullable-Typs nur das erneute Eingeben der Eigenschaften erfordert.
quelle