【问题标题】:Xml Serialization and deserialization fails [closed]Xml序列化和反序列化失败[关闭]
【发布时间】:2012-12-26 03:24:10
【问题描述】:

我知道这个问题已经被问过了,但是我有一个奇怪的问题,我不知道该怎么办:

public static class XmlHelper
{
    public static T Deserialize<T>(string xml)
    {
        using (var sr = new StringReader(xml))
        {
            var xs = new XmlSerializer(typeof(T));
            return (T)xs.Deserialize(sr);
        }
    }

    public static string Serialize(object o)
    {
        using (var sw = new StringWriter())
        {
            using (var xw = XmlWriter.Create(sw))
            {
                var xs = new XmlSerializer(o.GetType());
                xs.Serialize(xw, o);
                return sw.ToString();
            }
        }
    }
}

[Serializable]
public class MyClass
{
    public string Property1 {get;set;}
    public int Property2 {get;set;}
}

我正在序列化类:

var a = XmlHelper.Serialize(new MyClass{ Property1 = "a", Property2 = 3 });
var b = XmlHelper.Deserialize<object>(a);

错误:XML 文档中存在错误 (1, 41)。

编辑:我想反序列化一个 as 对象,可以吗?

【问题讨论】:

  • 失败在哪一行?
  • 您的 XML 格式是否正确?
  • 你能展示一下这个对象吗?
  • 对于XmlSerializer,诀窍始终是查看.InnerException,然后查看.InnerException,依此类推。如果您知道去哪里查找,它通常可以很好地告诉您问题所在。
  • @James 那将是return (T)xs.Deserialize(sr);,来自消息

标签: c# xml xml-serialization xml-deserialization


【解决方案1】:

您没有传入正确的序列化类型,请将您的代码更改为:

public static string Serialize<T>(T o)
{
    using (var sw = new StringWriter())
    {
        using (var xw = XmlWriter.Create(sw))
        {
            var xs = new XmlSerializer(typeof(T));
            xs.Serialize(xw, o);
            return sw.ToString();
        }
    }
}
...
// we don't need to explicitly define MyClass as the type, it's inferred
var a = XmlHelper.Serialize(new MyClass{ Property1 = "a", Property2 = 3 });
var b = XmlHelper.Deserialize<MyClass>(a);

【讨论】:

  • 实际情况下我想序列化为MyClass,反序列化为对象,可以吗?
  • @karaxuna 这对我来说似乎没有意义。只是把它当作一个对象? object b = XmlHelper.Deserialize&lt;MyClass&gt;(a)?或者您的意思是您想在编译时不知道哪种类型的情况下运行反序列化程序?
  • 是的,我反序列化的时候不知道是什么类型
  • AFAIK 你不能这样做。序列化程序需要知道目标类型,以便正确映射属性。或者,您可以切换到使用 JavaScriptSerializer/DataContractJsonSerializer 并将您的数据序列化为 JSON,这样您就可以在不知道类型的情况下进行反序列化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 2012-02-02
  • 2011-12-02
  • 2021-08-28
  • 1970-01-01
相关资源
最近更新 更多