反序列化派生 class 时出现 XmlSerializer 异常(<Derived xmlns=''> 不是预期的)
XmlSerializer exception when deserializing derived class (<Derived xmlns=''> was not expected)
我正在尝试使用 XmlSerializer 序列化和反序列化 类 的层次结构。序列化工作正常,但是当我尝试反序列化时出现此异常:
System.InvalidOperationException: There is an error in XML document (2, 2). ---> System.InvalidOperationException: <Derived xmlns=''>
was not expected.
这是我要反序列化的 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
, 期望 仅反序列化 Base
个对象。它不希望看到 <Derived>
元素。如果你使用
XmlSerializer deserializer = new XmlSerializer(typeof(Derived));
你没有得到例外。或者,当您 序列化 Derived
的实例时,您可以使用将生成 <Base>
元素的序列化器:
XmlSerializer serializer = new XmlSerializer(typeof(Base));
这仍然会反序列化为 Derived
的实例,因为 XML 将包含
xsi:type="Derived"
基本上你的序列化器和反序列化器需要用相同的类型构造。
我正在尝试使用 XmlSerializer 序列化和反序列化 类 的层次结构。序列化工作正常,但是当我尝试反序列化时出现此异常:
System.InvalidOperationException: There is an error in XML document (2, 2). ---> System.InvalidOperationException:
<Derived xmlns=''>
was not expected.
这是我要反序列化的 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
, 期望 仅反序列化 Base
个对象。它不希望看到 <Derived>
元素。如果你使用
XmlSerializer deserializer = new XmlSerializer(typeof(Derived));
你没有得到例外。或者,当您 序列化 Derived
的实例时,您可以使用将生成 <Base>
元素的序列化器:
XmlSerializer serializer = new XmlSerializer(typeof(Base));
这仍然会反序列化为 Derived
的实例,因为 XML 将包含
xsi:type="Derived"
基本上你的序列化器和反序列化器需要用相同的类型构造。