【问题标题】:Is possible to use abstract class in xml serialization when using XmlSerializer?使用 XmlSerializer 时是否可以在 xml 序列化中使用抽象类?
【发布时间】:2015-10-16 16:26:39
【问题描述】:

问题
当我将System.Xml.Serialization.XmlSerializer 与用System.Xml.Serialization 属性装饰的类(例如XmlRootXmlElement、...)一起使用时,我可以在某些类型为抽象类的类中创建一个属性吗?

场景
我有这些课程:

[XmlRoot("autor")]
public class Author
{
    [XmlElement("name")]
    public string Name { get; set; }

    [XmlArray("books")]
    [XmlArrayItem("book")]
    public List<Book> Livros { get; set; }

    [XmlElement("info")]
    public ExtraData ExtraData { get; set; }
}

public class Book
{
    [XmlElement("name")]
    public string Name { get; set; }

    [XmlElement("year")]
    public int Year { get; set; }
}

public abstract class ExtraData
{
}

public class ExtraDataTest : ExtraData
{
    [XmlElement("test")]
    public string Test { get; set; }
}

我试试这个 sn-p:

var author = new Author
{
    Name = "George R. R. Martin",
    Livros = new List<Book>
    {
        new Book { Name = "A Game of Thrones", Year = 1996 },
        new Book { Name = "The Hedge Knight", Year = 1998 },
    },
    // ExtraData = new ExtraDataTest { Test = "Some Info" }
    // See the comment below to know why this line was commented.
};

var serializer = new XmlSerializer(typeof(Author));

using(var ms = new MemoryStream())
using(var sw = new StreamWriter(ms))
using(var sr = new StreamReader(ms))
{
    var ns = new XmlSerializerNamespaces();
    ns.Add("","");
    serializer.Serialize(sw, author, ns);

    sw.Flush();
    ms.Position = 0;
    sr.ReadToEnd().Dump(); // Dump is a extended method of LinqPad
}

结果是:

<?xml version="1.0" encoding="utf-8"?>
<autor>
  <name>George R. R. Martin</name>
  <books>
    <book>
      <name>A Game of Thrones</name>
      <year>1996</year>
    </book>
    <book>
      <name>The Hedge Knight</name>
      <year>1998</year>
    </book>
  </books>
</autor>

问题
因此,如果我取消注释设置 ExtraData 属性的行,当我尝试序列化对象时会抛出一个异常:

System.ObjectDisposedException
无法访问已关闭的 Stream。

所以这就是为什么我要问是否可能,如果可以,如何?

【问题讨论】:

    标签: c# .net xml serialization xml-parsing


    【解决方案1】:

    有可能。

    我从您的代码中看到的唯一缺少的是在您的抽象类上使用XmlInclude attrubute 来通知序列化程序它应该寻找这样的派生类:

    [XmlInclude(typeof(ExtraDataTest))]
    public abstract class ExtraData
    {
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      • 2020-12-09
      • 1970-01-01
      • 2013-04-26
      • 2018-06-14
      相关资源
      最近更新 更多