2015-10-16 29 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 
{ 
} 
相關問題