Kann XmlSerializer in ein Nullable deserialisieren ?
-
08-07-2019 - |
Frage
Ich wollte eine XML-Nachricht deserialisiert ein Element enthält, das nil="true"
in eine Klasse mit einer Eigenschaft des Typs int?
markiert werden können. Die einzige Art, wie ich es an der Arbeit konnte, war meine eigene NullableInt
Art zu schreiben, die IXmlSerializable
implementiert. Gibt es einen besseren Weg, es zu tun?
Ich schrieb das volle Problem und die Art, wie ich es gelöst auf meinem Blog .
Lösung
Ich glaube, Sie brauchen die nil = „true“ mit einem Namespace, um das Präfix für XmlSerializer auf null deserialise.
<?xml version="1.0" encoding="UTF-8"?>
<entities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="array">
<entity>
<id xsi:type="integer">1</id>
<name>Foo</name>
<parent-id xsi:type="integer" xsi:nil="true"/>
Andere Tipps
Meine Lösung ist, vorverarbeitet, um die Knoten, keine „Null“ fixing Attribute:
public static void FixNilAttributeName(this XmlNode @this)
{
XmlAttribute nilAttribute = @this.Attributes["nil"];
if (nilAttribute == null)
{
return;
}
XmlAttribute newNil = @this.OwnerDocument.CreateAttribute("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance");
newNil.Value = nilAttribute.Value;
@this.Attributes.Remove(nilAttribute);
@this.Attributes.Append(newNil);
}
ich dieses Paar mit einer rekursiven Suche nach untergeordneten Knoten, so dass für jede gegebene XmlNode (oder XmlDocument), habe ich einen einzigen Anruf vor Deserialisierung ausgeben kann. Wenn Sie das Original in-Speicherstruktur unverändert, arbeiten mit einem Klon () des XmlNode behalten wollen.
Der außerordentlich faul Weg, es zu tun. Es ist zerbrechlich für eine Reihe von Gründen, aber meine XML ist einfach genug, eine solche schnelle und schmutzige Lösung zu gewährleisten.
xmlStr = Regex.Replace(xmlStr, "nil=\"true\"", "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"");