关于如何序列化具有抽象基类的通用对象列表的任何良好示例。非抽象基类的样本列在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. 抽象类的序列化
- 3. De序列化XML中的抽象类
- 4. C#XML使用抽象类序列化
- 5. XML序列化:对象未序列化
- 6. XML包含对象列表的对象的序列化列表
- 7. 反序列化:抽象类
- 8. 如何序列化/反序列化具有公共根类的对象列表?
- 9. 对象列表序列化xml错误
- 10. 序列化为XML并包含序列化对象的类型
- 11. 序列化对象列表
- 12. 序列化对象列表
- 13. 如何反序列化具有可序列化对象数组的类
- 14. 类对象的序列化
- 15. Android XML对象序列化
- 16. Xml序列化对象(HttpBrowserCapabilities)
- 17. XML对象序列化
- 18. 序列化对象到XML
- 19. JMS序列化器用抽象父类反序列化
- 20. 如何反序列化抽象类从XML的具体实现
- 21. 杰克逊反序列化一个抽象类的子类的对象列表
- 22. 序列化具有接口的对象
- 23. 序列化抽象类的问题
- 24. newtonsoft JSON序列化的抽象类
- 25. Java - 序列化对象中的序列化对象的问题
- 26. 反序列化序列化对象
- 27. Java可序列化对象
- 28. 对象不可序列化
- 29. 使用C#序列化Java可反序列化的对象
- 30. Java-使用Xstream序列化不可序列化的对象
同意@Dmitry。另一个答案可以在没有XmlInclude的序列化中找到http://stackoverflow.com/questions/370291/serializing-without-xmlinclude – walter 2012-02-16 03:55:23