wal*_*ter 7 .net c# xml-serialization
有关如何使用抽象基类序列化通用对象列表的任何好示例.具有非抽象基类的样本列在XML Serialize可序列化对象的通用列表中.我的基类类似于Microsoft.Build.Utilities.Task
Mar*_*tin 12
另一种方法是使用将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);
}
}
Run Code Online (Sandbox Code Playgroud)
...这也会产生更好看的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>
Run Code Online (Sandbox Code Playgroud)
具有多个派生类型的抽象类通常很有用,以允许使用强类型列表等.
例如,您可能有一个抽象的DocumentFragment类和两个名为TextDocumentFragment和CommentDocumentFragment的具体类(这个例子来自Willis).
这允许创建List属性,该属性只能包含这两种类型的对象.
如果您尝试创建一个返回此列表的WebService,则会出现错误,但这很容易解决下面的代码....
[Serializable()]
[System.Xml.Serialization.XmlInclude(typeof(TextDocumentFragment))]
[System.Xml.Serialization.XmlInclude(typeof(CommentDocumentFragment))]
public abstract class DocumentFragment {
...}
Run Code Online (Sandbox Code Playgroud)
XmlInclude属性告诉类它可能被序列化为这两个派生类.
这将在DocumentFragment元素中生成一个属性,指定实际类型,如下所示.
<DocumentFragment xsi:type="TextDocumentFragment">
Run Code Online (Sandbox Code Playgroud)
使用此方法也将包含特定于派生类的任何附加属性.
| 归档时间: |
|
| 查看次数: |
9426 次 |
| 最近记录: |