反序列化派生类时出现 XmlSerializer 异常(未预期出现

2024-04-19

我正在尝试使用 XmlSerializer 序列化和反序列化类的层次结构。序列化工作正常,但是当我尝试反序列化时,出现以下异常:

System.InvalidOperationException: XML 文档 (2, 2) 中存在错误。 ---> System.InvalidOperationException:<Derived xmlns=''>没想到。

这是我试图反序列化的 xml:

<?xml version="1.0"?>
<Derived xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <BaseStr>Base</BaseStr>
  <DerivedStr>Derived</DerivedStr>
</Derived>

这是我正在使用的代码:

using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

[XmlInclude(typeof(Derived))]
public abstract class Base 
{
    public string BaseStr { get; set; }
}

public class Derived : Base
{
    public string DerivedStr { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        try
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Derived));
            MemoryStream ms = new MemoryStream();
            serializer.Serialize(ms, new Derived() { DerivedStr = "Derived", BaseStr = "Base" });

            Console.WriteLine(Encoding.ASCII.GetChars(ms.ToArray()));

            ms.Position = 0;

            XmlSerializer deserializer = new XmlSerializer(typeof(Base));
            Base b = (Base)deserializer.Deserialize(ms);
            Console.WriteLine(b.GetType().Name);
        }
        catch(Exception ex)
        {
            Console.WriteLine();
            Console.WriteLine(ex.ToString());
        }
    }
}

为什么反序列化不起作用?我怎样才能让它发挥作用?


您正在创建一个XmlSerializer which expects反序列化Base对象。它不希望看到<Derived>元素。如果你使用

XmlSerializer deserializer = new XmlSerializer(typeof(Derived));

你没有得到例外。或者,当您连载的实例Derived,您可以使用序列化器来生成<Base>元素:

XmlSerializer serializer = new XmlSerializer(typeof(Base));

这仍然会反序列化为一个实例Derived,因为 XML 将包括

xsi:type="Derived"

基本上,您的序列化器和反序列化器需要使用相同的类型来构造。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反序列化派生类时出现 XmlSerializer 异常(未预期出现 ) 的相关文章

随机推荐