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
无法访问已关闭的流。
所以这就是为什么我问是否有可能,如果是的话,怎么样?