【问题标题】:Deserialize objectstring convert string to bool反序列化 objectstring 将字符串转换为 bool
【发布时间】:2014-10-20 08:12:03
【问题描述】:

我有一个类,我将它序列化为一个 XML 字符串。没有问题。

反序列化也可以,但它会将 XML“true”的字段设置为 false(可能是因为它无法转换为布尔值 true。

所以我用

装饰了那个房子
public class X 
{
    // ...
    private bool _status = false;
    [XmlText]
    public bool Status {
        get {return _status;}
        set {_status=value;}
    }
    // ...
}

然后我得到“xmlserializer - 出现反映类型 X 的错误”...

那么除了用字符串 Status 替换我的所有检查之外,还有什么解决方法?

参考: - XmlSerializer - There was an error reflecting type - Deserialize boolean element with string attribute

应要求更新: 序列化/反序列化类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// for serializer:
using System.Xml;
using System.Xml.Serialization;
using System.IO;

namespace StackOverflow
{

    static class Serializing
    {
        public static T XmlDeserializeFromString<T>(this string objectData)
        {
            return (T)XmlDeserializeFromString(objectData, typeof(T));
        }

        public static object XmlDeserializeFromString(this string objectData, Type type)
        {
            var serializer = new XmlSerializer(type);
            object result;

            using (TextReader reader = new StringReader(objectData))
            {
                result = serializer.Deserialize(reader);
            }

            return result;
        }

        public static string Serialize<T>(this T value)
        {
            if (value == null) { return string.Empty; }
            try
            {
                var xmlserializer = new XmlSerializer(typeof(User));
                var stringWriter = new StringWriter();
                using (var writer = XmlWriter.Create(stringWriter))
                {
                    xmlserializer.Serialize(writer, value);
                    return stringWriter.ToString();
                }
            }
            catch (Exception e)
            {
                throw new Exception("A Serialization Error Occurred", e);
            }
        }
    }
}

【问题讨论】:

  • 好吧,您引用的示例鞋是一个 .config 文件。您从哪里获得状态读取
  • 对象中的状态字段可以通过管道中的很多方法来设置。最后我 xmlserializer.Serialize(writer,value) 它
  • 当我们看到的只是公共 bool 状态时,很难确定发生了什么......你能显示你正在序列化该对象的实际代码吗
  • 在您的问题中退后一步,Deserializing also works but it sets a field that is the XML "true" to false (probably because it can not convert to boolean true. - 也许您太愿意接受之前的问题?我怀疑还有其他问题。
  • 这就是我的意思——还有其他问题——因为这不是通常发生的事情,对吧! (用一个单独的小点头应用程序试试。)这个字符串是什么?它是如何存储的(在序列化/反序列化之前和之后)?也许它的编码不像预期的那样?

标签: c# xml generics serialization


【解决方案1】:

由于[XmlText] 属性引发异常,该属性不适用于bool 类型。但是,如果您删除 XmlText 属性,它应该可以正常工作。

我认为另一个例外来自您的 Serialize 方法中的 User 类型。您应该将其更改为 T 以使其正确,因为它是通用方法:

public static string Serialize<T>(this T value)
{
    if (value == null) { return string.Empty; }
    try
    {
        var xmlserializer = new XmlSerializer(typeof(T));
        var stringWriter = new StringWriter();
        using (var writer = XmlWriter.Create(stringWriter))
        {
            xmlserializer.Serialize(writer, value);
            return stringWriter.ToString();
        }
    }
    catch (Exception e)
    {
        throw new Exception("An Error Occurred", e);
    }
}

您还应该能够将您的属性转换为自动属性。

因为这段代码:

private bool _status = false;

public bool Status
{
    get { return _status; }
    set { _status = value; }
}

等于:

public bool Status { get; set; }

因为 bool 是默认设置为 false 的值类型。

【讨论】:

    【解决方案2】:

    回到你的问题,Deserializing also works but it sets a field that is the XML "true" to false (probably because it can not convert to boolean true. - 也许你太愿意接受之前的问题?我怀疑还有什么问题。

    我说其他事情是错误的,因为这不是通常会发生的事情,是吗! (尝试使用单独的小点头应用程序。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 2012-08-15
      相关资源
      最近更新 更多