C# 派生类型的XMLSerialization问题

C# 派生类型的XMLSerialization问题,c#,inheritance,xml-serialization,C#,Inheritance,Xml Serialization,我目前在使用派生类时遇到了从XML反序列化的问题。序列化工作得很好,但反之则会导致意外的元素异常 示例代码: public class Foo { //Some Properties } public class Bar : Foo { //more properties } public class Holder : IXmlSerializable { public Foo SomeObject; public void WriteXML(XmlWriter

我目前在使用派生类时遇到了从XML反序列化的问题。序列化工作得很好,但反之则会导致意外的元素异常

示例代码:

public class Foo
{
   //Some Properties
}

public class Bar : Foo
{
    //more properties
}

public class Holder : IXmlSerializable
{
   public Foo SomeObject;

   public void WriteXML(XmlWriter writer)
   {
       var lizer = new XmlSerializer(SomeObject.GetType());
       lizer.Serialize(writer,SomeObject);
   }

   public void ReadXML(XmlReader reader)
   {
       reader.MoveToContent();
       reader.ReadStartElement();

       var lizer = new XmlSerializer(typeof(Foo), new Type[] { typeof(Bar) });

       SomeObject = (Foo)lizer.Deserialize(reader);
   }
如果Holder.SomeObject设置为Bar的实例,则序列化将完全按照预期工作。但是,反序列化正在抛出。我的理解是,如果我给XmlSerializer提供了所有可能的类型,那么它应该选择正确的类型


是不是这样,还是我遗漏了什么?谢谢

您在序列化时需要使用与反序列化时相同的XmlSerializer构造函数,即您的代码将更改为:

public void WriteXML(XmlWriter writer)
{
    var lizer = new XmlSerializer(typeof(Foo), new Type[] { typeof(Bar) });
    lizer.Serialize(writer,SomeObject);
}

我喜欢'lizer'作为变量名。看到从反序列化中得到的异常将非常有用。谢谢,这适用于基本情况。但是,如果Bar实现IXmlSerializable,我在Holder.WriteXML过程中会遇到一个异常,说“类型Bar不能用于此上下文”,我认为这是正确的。。当您执行新的XmlSerializer(typeof(Foo))时,根xml元素将是(或预期是),而如果执行新的XmlSerializer(obj.GetType()),其中obj是一个条,则根xml元素将是。