XML Serializza booleano come 0 e 1
-
01-07-2019 - |
Domanda
Lo schema XML Parte 2 specifica che un'istanza di un tipo di dati definito come booleano può avere i seguenti valori letterali legali {true, false, 1, 0}.Il codice XML seguente, ad esempio, quando deserializzato, imposta la proprietà booleana "Emula" su true
.
<root>
<emulate>1</emulate>
</root>
Tuttavia, quando serializzo nuovamente l'oggetto nell'XML, ottengo true
invece del valore numerico.La mia domanda è: esiste un modo per controllare la rappresentazione booleana nell'XML?
Soluzione
Puoi implementare IXmlSerializable che ti consentirà di modificare l'output serializzato della tua classe come preferisci.Ciò comporterà la creazione dei 3 metodi GetSchema(), ReadXml(XmlReader r) e WriteXml(XmlWriter r).Quando si implementa l'interfaccia, vengono chiamati questi metodi anziché .NET che tenta di serializzare l'oggetto stesso.
Esempi possono essere trovati su:
http://www.developerfusion.co.uk/show/4639/ E
http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.aspx
Altri suggerimenti
Puoi farlo anche utilizzando la magia nera di alcuni attributi XmlSerializer:
[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); }
}
Puoi anche usare altri attributi per nascondere questo membro all'intellisense se ne sei offeso!Non è una soluzione perfetta, ma può essere più rapida rispetto all'implementazione di IXmlSerializable.
No, non utilizzando il System.Xml.XmlSerializer predefinito:dovresti cambiare il tipo di dati in un int per raggiungere questo obiettivo, o divertirti fornendo il tuo codice di serializzazione (possibile, ma non molto divertente).
Tuttavia, puoi semplicemente postelaborare l'XML generato, ovviamente, utilizzando XSLT o semplicemente utilizzando la sostituzione di stringa.Un po' complicato, ma piuttosto veloce, sia in termini di tempo di sviluppo che di esecuzione...