如果您的 XML 与 .net XML 序列化不兼容,那么最简单的方法是创建一个工厂来检测 XML 代表的资源类型,然后适当地处理它。如果要将解析放入对象中,则在创建对象后使用虚拟方法解析内部:
class CarResource
{
public string Color { get; private set; }
internal virtual void ReadFrom(XmlReader xml)
{
this.Color = xml.GetAttribute("colour");
}
}
class RaceCarResource : CarResource
{
public string Sponsor { get; private set; }
internal override void ReadFrom(XmlReader xml)
{
base.ReadFrom(xml);
this.Sponsor = xml.GetAttribute("name-on-adverts");
}
}
class SuperDuperUltraRaceCarResource : RaceCarResource
{
public string Super { get; private set; }
internal override void ReadFrom(XmlReader xml)
{
base.ReadFrom(xml);
this.Super = xml.GetAttribute("soup");
}
}
class CarResourceFactory
{
public CarResource Read(XmlReader xml)
{
CarResource car;
switch (xml.LocalName)
{
case "ordinary-car": car = new CarResource(); break;
case "racecar": car = new RaceCarResource(); break;
case "super_duper": car = new SuperDuperUltraRaceCarResource(); break;
default: throw new XmlException();
}
XmlReader sub = xml.ReadSubtree();
car.ReadFrom(sub);
sub.Close();
return car;
}
}
如果子类型的 XML 有任何子元素严格附加在超类型的内容之后或之前,这可以正常工作。否则,您必须做更多的工作来重用超类型的序列化,将其分解为更小的方法(例如,基础具有加载车轮数量、门、发动机尺寸的方法;赛车调用LoadDoorData
, LoadAeroFoilData
,LoadWheelData
如果用于赛车在车门和车轮数据之间有翼型数据。对于没有强加逻辑顺序的格式(XMI,RDF),您必须检查本地名称来决定调用哪个专用方法,如果您想调用它会有点混乱将它与虚拟方法结合起来。在这种情况下,最好使用单独的序列化助手。
如果要创建的类型集不固定为几种类型,则可以在工厂中使用其他机制。