1
但是,当我将对象序列化"/>

关于c#:XML序列化布尔值为0和1

关于c#:XML序列化布尔值为0和1

XML Serialize boolean as 0 and 1

XML模式第2部分规定,定义为布尔值的数据类型的实例可以具有以下合法文字{true,false,1,0}。
例如,以下XML在反序列化时,将布尔属性" Emulate"设置为true

1
2
3
<root>
    1</emulate>
</root>

但是,当我将对象序列化回XML时,得到的是true而不是数值。 我的问题是,有没有一种方法可以控制XML中的布尔表示形式?


您也可以通过使用一些XmlSerializer属性黑魔法来做到这一点:

1
2
3
4
5
6
7
8
9
10
[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); }
}

如果您对此成员不满意,还可以使用其他属性将其隐藏于智能感知中!这不是一个完美的解决方案,但是比实现IXmlSerializable更快。


您可以实现IXmlSerializable,它将允许您随意更改类的序列化输出。这将需要创建3个方法GetSchema(),ReadXml(XmlReader r)和WriteXml(XmlWriter r)。实现接口时,将调用这些方法,而不是.NET尝试序列化对象本身。

可以在以下位置找到示例:

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

http://msdn.microsoft.com/zh-CN/library/system.xml.serialization.ixmlserializable.aspx


不,不使用默认的System.Xml.XmlSerializer:您需要将数据类型更改为int才能实现此目的,或者搞乱提供自己的序列化代码(可能,但不太有趣)。

但是,您当然可以简单地对生成的XML进行后处理,而不是使用XSLT或简单地使用字符串替换。在开发时间和运行时间上都有点骇人听闻,但是很快。


推荐阅读