Wie bekomme ich den XmlSerializer zu Kodieren bools als ja/Nein?
Ich bin senden von xml zu einem anderen Programm, die erwartet boolean-flags wie "ja" oder "Nein", statt "true" oder "false".
Habe ich eine Klasse definiert, wie:
[XmlRoot()]
public class Foo {
public bool Bar { get; set; }
}
Wenn ich es zu serialisieren, meine Ausgabe sieht wie folgt aus:
<Foo><Bar>true</Bar></Foo>
Aber ich möchte es dies sein:
<Foo><Bar>yes</Bar></Foo>
Kann ich dies zum Zeitpunkt der Serialisierung? Ich würde es vorziehen, nicht zu haben, darauf zurückgreifen:
[XmlRoot()]
public class Foo {
[XmlIgnore()]
public bool Bar { get; set; }
[XmlElement("Bar")]
public string BarXml { get { return (Bar) ? "yes" : "no"; } }
}
Beachten Sie, dass ich auch in der Lage sein wollen Deserialisieren diese Daten wieder zurück.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, ich habe die Suche in diesem einige mehr. Hier ist, was ich mir ausgedacht habe:
Dann ändere ich meine Klasse " Foo " zu diesem:
Beachten Sie, dass, weil
YesNo
implizit gewirkt zubool
(und Umgekehrt), können Sie noch dazu:In anderen Worten, Sie können Sie behandeln wie ein bool.
Und w00t! Es serialisiert dieser:
Es auch korrekt deserialisiert.
Gibt es wohl einige Weg, um mein XmlSerializer automatisch Besetzung jeder
bool
s es trifft zuYesNo
s wie es geht - aber ich habe diese noch nicht gefunden haben. Wer?Sehr einfach. Verwenden Sie einen Ersatz-Eigenschaft. Gelten XmlIgnore auf die eigentliche Eigenschaft. Das Surrogat ist ein string, und müssen mit der XmlElement-Attribut, das ein element-Namen überschreiben. Geben Sie den Namen des eigentliche Eigenschaft in den override. Der Ersatz-Eigenschaft serialisiert unterschiedlich, basierend auf dem Wert der eigentlichen Immobilie. Sie müssen auch einen setter für die Leihmutter, und der setter sollte die eigentliche Eigenschaft entsprechend, für was es Wert serialisiert. In anderen Worten, es muss in beide Richtungen gehen.
Snip:
klicken Sie hier für vollständige kompilierbare Beispiel Quelle.
Machen einen bool-Wert zu serialisieren, wie "ja" oder "Nein" ändert den Datentyp von einem booleschen überhaupt. Stattdessen können Sie eine separate Eigenschaft, die wertet ein boolean und gibt "ja" oder "Nein" als angemessen für die Daten geben? Vielleicht könnte man auch Kraft, "ja" oder "Nein", indem Sie die return-Typ ein enum, das gibt nur diese Werte.
Das wäre des guten zuviel, aber vielleicht die Antwort auf Ihre not. Der einzige Grund, warum ich um ein enum für solch einen einfachen Wert ist, Sie wäre die Einschränkung der Werte vs. ermöglicht eine beliebige Zeichenfolge.
Ich mit dem property-Methode, aber anstatt zu überprüfen, ob die Zeichenfolge ist gleich ja oder Nein, ich bevorzuge es, zu überprüfen, ob die Zeichenkette beginnt mit (groß-und Kleinschreibung) "YT1". Dies ermöglicht die Datei zu enthalten, true, true, t, T, y, Y, yes, yes, 1 usw. alle, die zu true ausgewertet werden. Ich kann zwar angeben, dass false, false, False, f, F, n, N, no, no, 0, etc., alles, was nicht mit der true noch false ergibt.
Ihre Immobilie Beispiel ist wohl die einfachste Art und Weise Sie es tun könnte. Falls es hilft, ich glaube, dass Sie nicht brauchen, um machen es zu einem öffentlichen Eigentum, da das Attribut ISerializable implementiert, in der Klasse hinter Ihrem Rücken. Zum aktivieren der Deserialisierung, Sie sollten in der Lage sein, um Sie einfach zu implementieren
set { Bar = value == "yes"; }
@Blorgbeard:
Wenn Sie mehr als eine dieser YesNo Klassen in einem Objekt der Klasse,
stellen Sie sicher, Lesen Sie das gesamte element.
Sonst diese Probleme verursachen könnte.
Was Sie benötigen, zu tun, klingt eher wie ein Problem angezeigt. Wenn in Ihrer Anwendung die Möglichkeit, Sie besser zu halten als Datentyp ein boolean und anzeigen ja/Nein " in Ihrem Benutzer-interface.