2008-09-17 15 views
22

Das XML-Schema Teil 2 gibt an, dass eine Instanz eines Datentyps, der als boolesch definiert ist, die folgenden gültigen Literale {true, false, 1, 0} haben kann. Die folgende XML-Datei, z. B. beim Deserialisieren, setzt die boolesche Eigenschaft "Emulate" auf true.XML Serialize boolean als 0 und 1

<root> 
    <emulate>1</emulate> 
</root> 

Allerdings, wenn ich das Objekt wieder in die XML-Serialisierung, erhalte ich true anstelle des numerischen Werts. Meine Frage ist, gibt es eine Möglichkeit, dass ich die boolesche Darstellung im XML steuern kann?

+0

Sie möchten vielleicht erwähnen, was Sie für die XML-Serialisierung verwenden. –

+1

Eine ergänzende [Frage] (http://codereview.stackexchange.com/questions/4829/presenting-a-boolean-asan-an-int-for-xmlserialization-in-c) zum gleichen Thema über CoreReview.SE – MPelletier

Antwort

3

Sie können IXmlSerializable implementieren, mit dem Sie die serialisierte Ausgabe Ihrer Klasse ändern können, wie Sie wollen. Dies beinhaltet die Erstellung der 3 Methoden GetSchema(), ReadXml (XmlReader r) und WriteXml (XmlWriter). Wenn Sie die Schnittstelle implementieren, werden diese Methoden aufgerufen, anstatt .NET zu versuchen, das Objekt selbst zu serialisieren.

http://www.developerfusion.co.uk/show/4639/ und

http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.aspx

+1

Ja, ich hatte gehofft, das zu vermeiden, aber es scheint, dass ich hier nicht viel Auswahl habe. Danke :) –

1

Nein, nicht den standardmäßigen System.Xml.XmlSerializer verwenden: Sie müssen den Datentyp zu einem Int ändern, um das zu erreichen, oder mit Ihrem eigenen Serialisierungscode (möglich, aber nicht viel Spaß) herumalbern.

Sie können das generierte XML jedoch einfach nachbearbeiten, natürlich entweder mit XSLT oder einfach mit String-Substitution. Ein bisschen hack, aber ziemlich schnell, sowohl in der Entwicklungszeit als auch in der Laufzeit ...

51

Sie können dies auch tun, indem Sie einige XmlSerializer Attribut schwarze Magie:

Beispiele finden Sie unter

[XmlIgnore] 
public bool MyValue { get; set; } 

/// <summary>Get a value purely for serialization purposes</summary> 
[XmlElement("MyValue")] 
public string MyValueSerialize 
{ 
    get { return this.MyValue ? "1" : "0"; } 
    set { this.MyValue = XmlConvert.ToBoolean(value); } 
} 

Sie anderen können auch verwenden Attribute, um dieses Mitglied vor Intellisense zu verbergen, wenn Sie dadurch beleidigt sind! Es ist keine perfekte Lösung, aber es kann schneller sein als die Implementierung von IXmlSerializable.

+4

Das ist schrecklich, aber löst genau das Problem! Upvote nur um die kurzfristige Beibehaltung meines Frühstücks zu drohen. –

+0

Genau das habe ich gesucht! Vielen Dank, ich dachte, ich wäre niemals in der Lage, boolesche Werte in XML als "wahr" und "falsch" zu speichern. – Alex

+0

Nicht die beste Antwort: Jetzt haben Sie zwei Eigenschaften statt einer. Ich fand eine viel sauberere Lösung hier: https://stackoverflow.com/questions/5963423/xmlserializer-property-converter#answer-7775097 Zusammenfassend, erstellen Sie eine neue Klasse/struct, die IXmlSerializable implementiert. – Fl4v