【问题标题】:deserialize xml string to object将 xml 字符串反序列化为对象
【发布时间】:2015-08-04 15:38:07
【问题描述】:

我写这个方法是为了将一个xml字符串转换成对象:

private object Deserializer(Type type)
{
    object instance = null;
    try
    {
        XmlSerializer xmlSerializer = new XmlSerializer(type);
        using (StringReader stringreader = new StringReader(somestring))
        {
            instance = (type)xmlSerializer.Deserialize(stringreader);
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }

    return instance;
} 

但在这里:

instance = (type)xmlSerializer.Deserialize(stringreader);

出现此错误: 找不到类型或命名空间名称“type”(您是否缺少 using 指令或程序集引用?) 我该如何解决?

【问题讨论】:

  • 编译器已经告诉您出了什么问题:您将实例转换为的类型 type 不存在。你确定你使用了正确的演员表吗?

标签: c#


【解决方案1】:

您不能强制转换为“类型”,您需要像这样指定确切的类型(对于字符串):

(string)xmlSerializer.Deserialize(stringreader);

也许可以考虑使用这样的通用函数:

private T Deserializer<T>()
{
    T instance = null;
    try
    {
        var xmlSerializer = new XmlSerializer(typeof(T));
        using (var stringreader = new StringReader(somestring))
        {
            instance = (T)xmlSerializer.Deserialize(stringreader);
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }

    return instance;
} 

然后像这样调用函数:

var instance = xmlSerializer.Deserialize<SomeType>();

如果您只想在运行时指定类型,您可以使用:

instance = Convert.ChangeType(xmlSerializer.Deserialize(stringreader), type);

【讨论】:

  • try块没用,需要字符串参数,T变量没用。
【解决方案2】:

但是什么是 Type 是你创建的类还是什么?

也许你想这样做:

private object Deserializer<T>(T type)

编辑试试这个:

private static T LoadData<T>() where T : new ()
    {
        using (var reader = new StreamReader(@_path))
        {
            var xmlSerializer = new XmlSerializer(typeof(T));
            return (T) xmlSerializer.Deserialize(reader);
        }

    }

【讨论】:

  • Type 很可能是System.Type。而且我认为如果返回T 而不是object,您的解决方案会更好。
  • 我的错,我试着把它写得快。我编辑了我的评论
猜你喜欢
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2014-01-04
相关资源
最近更新 更多