C#布尔序列化问题

时间:2018-10-31 12:24:51

标签: c# boolean deserialization

我有一个要反序列化为布尔值的值,但是反序列化不支持给定的情况,即: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,但我宁愿坚持我所知道的,如果可能的话。

1 个答案:

答案 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; }
}