簡體   English   中英

使用XmlSerializer時可以在xml序列化中使用抽象類嗎?

[英]Is possible to use abstract class in xml serialization when using XmlSerializer?


當我將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; }
}

我嘗試以下代碼段:

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
無法訪問關閉的流。

所以這就是為什么我問是否有可能(如果可以)?

有可能的。

我從您的代碼中看到的唯一缺少的是在抽象類上使用XmlInclude屬性來通知序列化程序它應該尋找這樣的派生類:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM