![](/img/trans.png)
[英]Round values on serialization when using XmlSerializer to serialize to an XML string
[英]Is possible to use abstract class in xml serialization when using XmlSerializer?
題
當我將System.Xml.Serialization.XmlSerializer
與裝飾有System.Xml.Serialization
屬性的類(例如XmlRoot
, XmlElement
,...)一起使用時,可以在某些類型為抽象類的類中創建屬性嗎?
腳本
我有這些課:
[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.