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
、レースカーには、ドアとホイールのデータの間にエアロフォイルのデータがあります. 論理的な順序付けが課されていない形式 (XMI, RDF) の場合、ローカル名を調べて、呼び出す特殊なメソッドを決定する必要があります.仮想メソッドと組み合わせる. その場合は、別のシリアル化ヘルパーを使用することをお勧めします.LoadAeroFoilData
LoadWheelData
作成するタイプのセットがいくつかのタイプに固定されていない場合は、ファクトリで他のメカニズムを使用できます。