我有一个要反序列化为布尔值的值,但是反序列化不支持给定的情况,即:FALSE或TRUE,并且提供的格式会很麻烦地更改,抛出异常:
#00FF00
我知道这是因为XML序列化器不支持此功能。仅允许使用有效的XML模式值,例如“ false”或“ true”(研究的第一位,请检查!)。
因此,第一种选择是创建一个字符串属性来进行转换,如下所示:
const myButtonModel = {
color: "#0F0"
};
function changeColor() {
const buttonElement = document.getElementById("button");
myButtonModel.color = myButtonModel.color === "#0F0" ? "#F00" : "#0F0";
buttonElement.style.background = myButtonModel.color;
}
但是我不喜欢这样,因为它弄乱了我已经建立的干净类,并且需要围绕我在28个类中拥有的所有布尔值(这是研究的第二个部分,检查!)来说明这一点。
我收到的XML可能传递用于各种参数的许多布尔值,因此,如果我选择解析源数据,则需要知道所有的布尔元素是什么。这里的限制是XMLSerialiser,尽管这并不是它的错,我明白了。
我可以实现ISerializable接口并编写一个特定的实现,但是对于布尔值来说这是很多工作,而根据我所做的研究,我不相信有一种方法可以仅针对特定的属性显然可以减轻痛苦(研究的第三点!!!)。
还有其他序列化框架,可以解决此问题,例如ExtendedXmlSerializer,但我宁愿坚持我所知道的,如果可能的话。
答案 0 :(得分:2)
在可以识别需要此替代解析例程的所有布尔元素的前提下,可以实现自定义--filter
并将其传递给常规XmlTextReader
。
下面的XmlSerializer
接受需要特别注意的xml元素名称列表。
CustomXmlReader
与xml对应的类不知道此自定义解析。
public class CustomXmlReader : XmlTextReader
{
private readonly IList<String> _booleanFieldNames;
private Boolean _parseBooleanString;
public CustomXmlReader(IList<String> booleanFieldNames, TextReader reader) : base(reader)
{
this._booleanFieldNames = booleanFieldNames;
}
public override XmlNodeType MoveToContent()
{
XmlNodeType nodeType = base.MoveToContent();
this._parseBooleanString = ((XmlNodeType.Element == nodeType)
&& this._booleanFieldNames.Contains(this.Name)
);
return nodeType;
}
public override String ReadString()
{
String value = base.ReadString();
if (this._parseBooleanString)
{
if (value.Equals("TRUE", StringComparison.OrdinalIgnoreCase)
|| value.Equals("T", StringComparison.OrdinalIgnoreCase)
|| value.Equals("1", StringComparison.OrdinalIgnoreCase)
|| value.Equals("YES", StringComparison.OrdinalIgnoreCase)
|| value.Equals("Y", StringComparison.OrdinalIgnoreCase)
)
{
return "true";
}
return "false";
}
return value;
}
}
下面的代码解析以下xml结构
public class MyExample
{
public MyExample() {}
[XmlElement("BooleanField")]
public Boolean BooleanFieldString { get; set; }
}