XML序列化布尔值为0和1
时间:2020-03-05 18:59:10 来源:igfitidea点击:
XML模式第2部分规定,定义为布尔值的数据类型的实例可以具有以下合法文字{true,false,1,0}。
例如,以下XML在反序列化时,会将布尔属性" Emulate"设置为" true"。
<root> <emulate>1</emulate> </root>
但是,当我将对象序列化回XML时,得到的是" true"而不是数值。我的问题是,有没有一种方法可以控制XML中的布尔表示形式?
解决方案
回答
不,不使用默认的System.Xml.XmlSerializer:我们需要将数据类型更改为int才能实现此目的,或者搞乱提供自己的序列化代码(可能,但不太有趣)。
但是,我们当然可以简单地对生成的XML进行后处理,而不是使用XSLT或者简单地使用字符串替换。在开发时间和运行时间上都有点骇人,但很快。
回答
我们可以实现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
回答
我们也可以通过使用一些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); } }
如果我们对此成员不满意,还可以使用其他属性将其隐藏于智能感知中!这不是一个完美的解决方案,但是它比实现IXmlSerializable更快。