Хорошо, я изучал это еще немного. Вот что я придумала:
// use this instead of a bool, and it will serialize to "yes" or "no"
// minimal example, not very robust
public struct YesNo : IXmlSerializable {
// we're just wrapping a bool
private bool Value;
// allow implicit casts to/from bool
public static implicit operator bool(YesNo yn) {
return yn.Value;
}
public static implicit operator YesNo(bool b) {
return new YesNo() {Value = b};
}
// implement IXmlSerializable
public XmlSchema GetSchema() { return null; }
public void ReadXml(XmlReader reader) {
Value = (reader.ReadElementContentAsString() == "yes");
}
public void WriteXml(XmlWriter writer) {
writer.WriteString((Value) ? "yes" : "no");
}
}
Затем я изменяю свой класс Foo следующим образом:
[XmlRoot()]
public class Foo {
public YesNo Bar { get; set; }
}
Обратите внимание, что, поскольку YesNo
неявно преобразуется в bool
(и наоборот), вы все равно можете сделать это:
Foo foo = new Foo() { Bar = true; };
if ( foo.Bar ) {
// ... etc
Другими словами, вы можете относиться к нему как к булу.
И w00t! Сериализуется к этому:
<Foo><Bar>yes</Bar></Foo>
Он также правильно десериализуется.
Возможно, есть какой-то способ заставить мой XmlSerializer автоматически приводить любые bool
s, с которыми он сталкивается, к YesNo
s, как это происходит, - но я пока не нашел его. Кто-нибудь?