4

C# を使用して XPDL 標準からインポートおよびエクスポートしています。

XPDL 2.1を使用してクラスの階層を記述し、XmlSerializer. XPDL 2.2を実装する必要があります。

クラスの構造が変更されました。追加のパラメーターもあります。ルート クラスの子であるリストがありましArtifactsたが、新しいバージョンはDataObjectすべてのアーティファクトから失われました。DataObjects は、追加の List から に移動しましたWorkflowProcess

XPDL 2.1XPDL 2.2をサポートする必要があります。両方を実装する最良の方法は何ですか?

私は3つの方法を見ることができます:

  1. 既存の階層をコピーして、必要な修正を加えて貼り付けます (ひどい!)
  2. 基本クラスを作成し、2 つの子クラスを作成します。1 つは 2.1 用、もう 1 つは 2.2 用です (ただし、維持するには複雑すぎませんか?)
  3. enum変数を使用して条件付きシリアル化を実装します。クラスには 2.1 と 2.2 のスーパーセットが含まれます (このオプションは複雑すぎるようです)

より良いアプローチがあれば教えてください。

4

1 に答える 1

1

ソリューションに 2 つの追加の個別のプロジェクトを作成します。最初のクラスには、XPDL 2.1 から解析されるクラスが含まれている必要があります。

2 つ目は 2.2 用で、最初のプロジェクト フォルダのすべての cs ファイルをリンクとして含める必要があります。それらを手動で管理する代わりに、次の行を 2 番目のプロジェクト ファイルに追加します。

<Compile Include="..\ParserXPDL21\Classes\**\*.cs">
  <Link>Classes\file.cs</Link>
</Compile>

最初のプロジェクトにファイルを追加または削除するたびに、2 番目のプロジェクトを再読み込みすることを忘れないでください。そうしないと、そうするまで Visual Studio はそれをコンパイルしません。

2 番目のプロジェクトでは、プロジェクト プロパティで条件付き定数を宣言します: XDPL22

これで、最初のプロジェクト ファイルを次のように変更して、同じファイルで 2 つのバージョンを維持できます。

#if !XDPL22
namespace ParserXPDL21
#else
namespace ParserXPDL22
#endif
{
    [Serializable]
    public class Root
    {
#if !XDPL22
        public Artifact[] Artifacts { get; set; }
#endif
        public int NormalProperty1 { get; set; }
        public int NormalProperty2 { get; set; }
        public int NormalProperty3 { get; set; }

    }
}

その後、メイン プロジェクトからこれら 2 つのプロジェクトを参照し、2 つの異なるバージョンのクラスを使用できます。

非常にエレガントな方法のように思えますが、多くの重複コードを作成する必要がある場合に役立ちます。

読み取る XPDL のバージョンを確認する方法が必要です。ファイル拡張子を見るだけでよいかもしれませんが、それが同じ場合は2.2を読み取ろうとするだけで、例外がスローされるかデータが正しくない場合は、これが2.1であると考えるか、XmlReaderを使用してXMLを手動で読み取って確認できますデシリアライズ前。

于 2014-09-24T21:53:56.360 に答える