2015-10-16 80 views
2

问题
当我使用System.Xml.Serialization.XmlSerializer与饰有System.Xml.Serialization属性的类(例如XmlRootXmlElement ...)我可以创造一些类型的类的属性为抽象类?使用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
无法访问已关闭的流。

所以这就是为什么我问是否有可能,如果是的话,怎么样?

回答

3

这是可能的。

唯一缺少的,我看到从你的代码是使用XmlInclude attrubute上的抽象类来通知串行器,它应该寻找派生类是这样的:

[XmlInclude(typeof(ExtraDataTest))] 
public abstract class ExtraData 
{ 
} 
相关问题