2
問題
當我使用System.Xml.Serialization.XmlSerializer
與飾有System.Xml.Serialization
屬性的類(例如XmlRoot
,XmlElement
...)我可以創造一些類型的類的屬性爲抽象類?使用XmlSerializer時,是否可以在xml序列化中使用抽象類?
方案
我有這些類:
[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
無法訪問已關閉的流。
所以這就是爲什麼我問是否有可能,如果是的話,怎麼樣?