Xml序列化与"真"和"假"

sha*_*art 15 c# xml boolean xml-serialization

我遇到了使用布尔值反序列化XML文件的问题.我反序列化的源XML文件是从VB6应用程序创建的,其中所有布尔值都是大写的(True,False).当我尝试反序列化XML时,我得到了一个

System.FormatException: The string 'False' is not a valid Boolean value.
Run Code Online (Sandbox Code Playgroud)

有没有办法说用属性忽略大小写?

jeo*_*man 6

根据另一个堆栈溢出问题,您可以执行以下操作:

public class MySerilizedObject
{
    [XmlIgnore]
    public bool BadBoolField { get; set; }

    [XmlElement("BadBoolField")]
    public string BadBoolFieldSerialize
    {
        get { return this.BadBoolField ? "True" : "False"; }
        set
        {
            if(value.Equals("True"))
                this.BadBoolField = true;
            else if(value.Equals("False"))
                this.BadBoolField = false;
            else
                this.BadBoolField = XmlConvert.ToBoolean(value);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Ken*_*ett 5

这是我根据我发现的其他一些问题提出的一个更干净的解决方案。它更干净,因为除了将类型声明为 SafeBool 之外,您不需要在代码中执行任何操作,如下所示:

public class MyXMLClass
{
    public SafeBool Bool { get; set; }
    public SafeBool? OptionalBool { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

您甚至可以将它们设为可选,并且一切正常。此 SafeBool 结构将处理 true/false、yes/no 或 y/n 的任何情况变体。它总是序列化为 true/false,但是我有其他与此类似的结构,当模式需要时,我用它专门序列化为 y/n 或 yes/no(即:BoolYN、BoolYesNo 结构)。

using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;

namespace AMain.CommonScaffold
{
    public struct SafeBool : IXmlSerializable
    {
        private bool _value;

        /// <summary>
        /// Allow implicit cast to a real bool
        /// </summary>
        /// <param name="yn">Value to cast to bool</param>
        public static implicit operator bool(
            SafeBool yn)
        {
            return yn._value;
        }

        /// <summary>
        /// Allow implicit cast from a real bool
        /// </summary>
        /// <param name="b">Value to cash to y/n</param>
        public static implicit operator SafeBool(
            bool b)
        {
            return new SafeBool { _value = b };
        }

        /// <summary>
        /// This is not used
        /// </summary>
        public XmlSchema GetSchema()
        {
            return null;
        }

        /// <summary>
        /// Reads a value from XML
        /// </summary>
        /// <param name="reader">XML reader to read</param>
        public void ReadXml(
            XmlReader reader)
        {
            var s = reader.ReadElementContentAsString().ToLowerInvariant();
            _value = s == "true" || s == "yes" || s == "y";
        }

        /// <summary>
        /// Writes the value to XML
        /// </summary>
        /// <param name="writer">XML writer to write to</param>
        public void WriteXml(
            XmlWriter writer)
        {
            writer.WriteString(_value ? "true" : "false");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Shi*_*iji 4

您可以将该值作为字符串读入字符串字段,然后使用一个只读 bool 字段,其中包含 if 语句以返回 bool true 或 false。

例如(使用 C#):

public bool str2bool(string str)
{
  if (str.Trim().ToUpper() == "TRUE")
      return true;
  else
      return false;
}
Run Code Online (Sandbox Code Playgroud)

您可以在模板中使用它:

<xsl:if test="user:str2bool($mystr)">
Run Code Online (Sandbox Code Playgroud)