C# 反序列化派生类时出现XmlSerializer异常(<;派生xmlns=';';>;不应出现)

C# 反序列化派生类时出现XmlSerializer异常(<;派生xmlns=';';>;不应出现),c#,serialization,xml-serialization,C#,Serialization,Xml Serialization,我正在尝试使用XmlSerializer对类的层次结构进行序列化和反序列化。序列化工作正常,但当我尝试反序列化时,会出现以下异常: System.InvalidOperationException:XML文档(2,2)中存在错误。-->System.InvalidOperationException:不是预期的 这是我正在尝试反序列化的xml: <?xml version="1.0"?> <Derived xmlns:xsi="http://www.w3.org/2001/XM

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

System.InvalidOperationException:XML文档(2,2)中存在错误。-->System.InvalidOperationException:
不是预期的

这是我正在尝试反序列化的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>

为什么反序列化不起作用?如何使其工作?

您正在创建一个
XmlSerializer
,它只需要反序列化
Base
对象。它不希望看到
元素。如果你使用

XmlSerializer deserializer = new XmlSerializer(typeof(Derived));
你没有例外。或者,当序列化
派生的
实例时,可以使用序列化程序生成一个
元素:

XmlSerializer serializer = new XmlSerializer(typeof(Base));
它仍将反序列化为
派生的
的实例,因为XML将包括

xsi:type="Derived"

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

您正在创建一个
XmlSerializer
,它只需要反序列化
基本对象。它不希望看到
元素。如果你使用

XmlSerializer deserializer = new XmlSerializer(typeof(Derived));
你没有例外。或者,当序列化
派生的
实例时,可以使用序列化程序生成一个
元素:

XmlSerializer serializer = new XmlSerializer(typeof(Base));
它仍将反序列化为
派生的
的实例,因为XML将包括

xsi:type="Derived"

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

您正在创建一个
XmlSerializer
,它只需要反序列化
基本对象。它不希望看到
元素。如果你使用

XmlSerializer deserializer = new XmlSerializer(typeof(Derived));
你没有例外。或者,当序列化
派生的
实例时,可以使用序列化程序生成一个
元素:

XmlSerializer serializer = new XmlSerializer(typeof(Base));
它仍将反序列化为
派生的
的实例,因为XML将包括

xsi:type="Derived"

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

您正在创建一个
XmlSerializer
,它只需要反序列化
基本对象。它不希望看到
元素。如果你使用

XmlSerializer deserializer = new XmlSerializer(typeof(Derived));
你没有例外。或者,当序列化
派生的
实例时,可以使用序列化程序生成一个
元素:

XmlSerializer serializer = new XmlSerializer(typeof(Base));
它仍将反序列化为
派生的
的实例,因为XML将包括

xsi:type="Derived"


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

非常感谢您提供了一个简短但完整的示例来演示此问题-如果您下次可以使用指令,以便我们可以复制/粘贴/编译,那将非常感谢。我现在已经在这里添加了它们;非常感谢您提供了一个简短但完整的示例来演示这个问题-如果您下次可以提供使用指令,这样我们就可以复制/粘贴/编译了,那将不胜感激。我现在已经在这里添加了它们;非常感谢您提供了一个简短但完整的示例来演示这个问题-如果您下次可以提供使用指令,这样我们就可以复制/粘贴/编译了,那将不胜感激。我现在已经在这里添加了它们;非常感谢您提供了一个简短但完整的示例来演示这个问题-如果您下次可以提供使用指令,这样我们就可以复制/粘贴/编译了,那将不胜感激。我现在已经在这里添加了它们;谢谢你的回答。在我的例子中,我有多个派生类,我不知道在运行时反序列化哪个派生类,因此我将使用
typeof(Base)
对它们进行序列化,以便序列化程序编写
xsi:type
属性。不过,我还有一个后续问题:我的下一步是实现
IXmlSerializable
来控制输出。如果实现该接口,则不会写出
xsi:type
属性,因此反序列化失败,因为类型未知。你知道我能做些什么吗?@Ove:不,我对这方面不太了解。我建议你多研究一会儿,然后用一个例子问一个新问题。谢谢你的帮助,我在这里贴了一个后续问题:谢谢你的回答。在我的例子中,我有多个派生类,我不知道在运行时反序列化哪个派生类,因此我将使用
typeof(Base)
对它们进行序列化,以便序列化程序编写
xsi:type
属性。不过,我还有一个后续问题:我的下一步是实现
IXmlSerializable
来控制输出。如果实现该接口,则不会写出
xsi:type
属性,因此反序列化失败,因为类型未知。你知道我能做些什么吗?@Ove:不,我对这方面不太了解。我建议你多研究一会儿,然后用一个例子问一个新问题。谢谢你的帮助,我在这里贴了一个后续问题:谢谢你的回答。在我的例子中,我有多个派生类,我不知道在运行时反序列化哪个派生类,因此我将使用
typeof(Base)
对它们进行序列化,以便序列化程序编写
xsi:type
属性。不过,我还有一个后续问题:我的下一步是实现
IXmlSerializable
来控制输出。如果实现该接口,则不会写出
xsi:type
属性,因此