gpt4 book ai didi

c# boolean 序列化问题

转载 作者:行者123 更新时间:2023-11-30 12:20:11 24 4
gpt4 key购买 nike

我有一个值我想反序列化为 boolean 值,但反序列化不支持给定的情况,即:FALSE 或 TRUE,并且提供的格式更改起来很麻烦,我抛出异常:

System.FormatException: The string 'FALSE' is not a valid Boolean value.

我知道这是因为 XML 序列化程序不支持它;只允许使用有效的 XML 模式值,例如“false”或“true”(研究的第一部分,检查!)。

因此,第一种选择是创建一个字符串属性来进行转换,如下所示:

public class MyExample
{
[XmlIgnore] public bool _booleanField { get; set; }

[XmlElement("BooleanField")]
public string BooleanFieldString
{
get => _booleanField.ToString().ToLower();
set => _booleanField = ConvertBooleanStringValue(value);
}

private bool ConvertBooleanStringValue(string booleanAsString)
{
switch (booleanAsString.ToUpper())
{
case "TRUE":
case "T":
case "1":
case "Y":
case "YES":
return true;
case "FALSE":
case "F":
case "0":
case "N":
case "NO":
return false;
default:
return false;
}
}
}

但我不喜欢这样,因为它弄乱了我构建的干净类,并且需要围绕我在 28 个类中拥有的所有 boolean 值添加这个(第二部分研究,检查!)。

我收到的 XML 可能会传递大量 boolean 值,用于各种参数,因此如果我选择解析源数据,我需要知道所有 boolean 元素是哪些。这里的限制是 XMLSerialiser,虽然这并不是它的错,但我明白了。

我可以实现 ISerializable 接口(interface)并编写一个特定的实现,但是对于一个 boolean 值来说这是很多工作,而且根据我所做的研究,我不相信有一种方法可以只对特定的属性执行此操作这显然会减轻疼痛(第三点研究!!!)。

还有其他序列化框架,可以像 ExtendedXmlSerializer 一样解决这个问题,但如果可能的话,我宁愿坚持我所知道的。

最佳答案

在您可以识别所有需要此替代解析例程的 boolean 元素的前提下,您可以实现自定义 XmlTextReader 并将其传递给常规 XmlSerializer

下面的 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; }
}

下面的代码解析了下面的xml结构

const String XML = @"
<MyExample>
<BooleanField>T</BooleanField>
</MyExample>";

using (var stringReader = new StringReader(XML))
using (var xmlReader = new CustomXmlReader(new List<String> { "BooleanField" }, stringReader))
{
XmlSerializer serializer = new XmlSerializer(typeof(MyExample));
MyExample mx = serializer.Deserialize(xmlReader) as MyExample;
Console.WriteLine(mx.BooleanFieldString); // True
}

关于c# boolean 序列化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53083284/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com