API を介して別のプログラムのプラグインを作成しています。現在の状態を保存するために、私のプラグインは Project オブジェクトのインスタンスを XML にシリアル化し、API によって提供される機能であるユーザー文字列に保存することでファイルに保存します。また、現在使用されているプラグインのバージョン番号を含む別の文字列も格納されます。
ユーザーがファイルを開くと、私のプラグインはバージョン番号をチェックします。現在のプラグインのバージョンがファイルに保存されているバージョンと同じでない場合、バージョンが異なること、およびファイルがプラグインをクラッシュさせる可能性があることをユーザーに警告するメッセージが表示されます。
ユーザーが新しいバージョンのプラグインで古いファイルを開いたときに自動的に実行される一連の移行スクリプトを提供したいと考えています。私の質問は、これらは通常どこに行き、どのように整理されているのですか?
また、バージョン間で Project クラスが大幅に変更され、古いファイルからプロジェクトを逆シリアル化しようとすると、新しい Project クラスで失敗すると言います。アセンブリである Project クラスのすべてのバージョンのコピーを保持したくはありませんが、同時に XML を解析しなければならないのはさらに面倒です。XML の解析が最良の選択肢であると仮定すると、以下のコードよりも組織化された方法を提案できますか?
public string MigrateProject(int fileVersion, int plugInversion, string proj)
{
if(fileVersion>plugInversion)
{
//tell user to upgrade their copy of the plugin
return null;
}
if(fileVersion ==1)
{
string v2 = Migrate1to2(serializedProject);
string v3 = Migrate2to3(v2);
string v4 = Migrate3to4(v3);
return v4;
}
else if(fileVersion ==2)
{
string v3 = Migrate2to3(serializedProject);
string v4 = Migrate3to4(v3);
return v4;
}
else if(fileVersion ==3)
{
string v4 = Migrate3to4(serializedProject);
return v4;
}
else
{
//could not migrate project message
return null;
}
}