關於如何序列化具有抽象基類的通用對象列表的任何良好示例。非抽象基類的樣本列在XML Serialize generic list of serializable objects中。我的基類與Microsoft.Build.Utilities.TaskXML序列化具有抽象基類的可序列化對象的通用列表
6
A
回答
4
通常使用具有多個派生類型的抽象類來允許使用強類型列表等。
例如,您可能有一個DocumentFragment類,它是抽象的和兩個名爲TextDocumentFragment和CommentDocumentFragment的具體類(此示例來自Willis)。
這允許創建一個List屬性,它只能包含這兩種類型的對象。
如果試圖創建一個返回該列表中你會得到一個錯誤一個WebService,但是這是很容易用下面的代碼來解決....
[Serializable()]
[System.Xml.Serialization.XmlInclude(typeof(TextDocumentFragment))]
[System.Xml.Serialization.XmlInclude(typeof(CommentDocumentFragment))]
public abstract class DocumentFragment {
...}
的XmlInclude屬性告訴類,它可能被序列化爲這兩個派生類。
這將在DocumentFragment元素中生成一個指定實際類型的屬性,如下所示。
<DocumentFragment xsi:type="TextDocumentFragment">
使用此方法還將包含特定於派生類的任何附加屬性。
11
另一種方法是使用XmlElementAttribute
移動已知類型的泛型列表本身的列表...
using System;
using System.Xml;
using System.Xml.Serialization;
using System.Collections.Generic;
public abstract class Animal
{
public int Weight { get; set; }
}
public class Cat : Animal
{
public int FurLength { get; set; }
}
public class Fish : Animal
{
public int ScalesCount { get; set; }
}
public class AnimalFarm
{
[XmlElement(typeof(Cat))]
[XmlElement(typeof(Fish))]
public List<Animal> Animals { get; set; }
public AnimalFarm()
{
Animals = new List<Animal>();
}
}
public class Program
{
public static void Main()
{
AnimalFarm animalFarm = new AnimalFarm();
animalFarm.Animals.Add(new Cat() { Weight = 4000, FurLength = 3 });
animalFarm.Animals.Add(new Fish() { Weight = 200, ScalesCount = 99 });
XmlSerializer serializer = new XmlSerializer(typeof(AnimalFarm));
serializer.Serialize(Console.Out, animalFarm);
}
}
...這也將導致一個更好看的XML輸出(不難看xsi:type
屬性)...
<?xml version="1.0" encoding="ibm850"?>
<AnimalFarm xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Cat>
<Weight>4000</Weight>
<FurLength>3</FurLength>
</Cat>
<Fish>
<Weight>200</Weight>
<ScalesCount>99</ScalesCount>
</Fish>
</AnimalFarm>
+0
如果你不想保留Animals元素,你可以使用XmlArrayItemAttribute來代替。 – Console 2014-11-10 09:14:19
相關問題
- 1. 抽象類的序列化
- 2. XML序列化:對象未序列化
- 3. XML包含對象列表的對象的序列化列表
- 4. 如何序列化/反序列化具有公共根類的對象列表?
- 5. 序列化爲XML幷包含序列化對象的類型
- 6. 序列化對象列表
- 7. 序列化對象列表
- 8. Xml序列化對象(HttpBrowserCapabilities)
- 9. 序列化對象到XML
- 10. Android XML對象序列化
- 11. 傑克遜反序列化一個抽象類的子類的對象列表
- 12. newtonsoft JSON序列化的抽象類
- 13. 反序列化序列化對象
- 14. 對象不可序列化
- 15. Spring:序列化引用了不可序列化bean的對象
- 16. 使用C#序列化Java可反序列化的對象
- 17. Java-使用Xstream序列化不可序列化的對象
- 18. 使用泛型的抽象類的成員的XML序列化
- 19. 帶有對象列表的對象的PHP序列化
- 20. 可能序列化一個不可序列化的對象?
- 21. 使用序列化對象列表
- 22. 對象序列化
- 23. 對象序列化
- 24. 序列化對象
- 25. 對象序列化
- 26. IllegalAccessException - 繼承不可序列化的對象的序列化
- 27. Jackson反序列化抽象類
- 28. 反序列化由SignalR作爲抽象類傳遞的對象
- 29. 通過序列化/反序列化維護對象引用
- 30. 根據正在序列化的類修改對象序列化
同意@Dmitry。另一個答案可以在沒有XmlInclude的序列化中找到http://stackoverflow.com/questions/370291/serializing-without-xmlinclude – walter 2012-02-16 03:55:23