2009-08-07 16 views
1

.NETアプリケーションでは、アプリケーションプロジェクトファイルのバイナリシリアル化が必要です。メインプロジェクトクラスファイルは、次のメソッドを使用して自身をシリアライズします(すべての例外処理はわかりやすくするために削除されています)。自分の.NETシリアル化を読み取​​ることができません

public void ProjectSerialize(string filename) 
    { 
     Stream s = File.Open(filename, FileMode.Create); 
     BinaryFormatter b = new BinaryFormatter(); 
     b.Serialize(s, this); 
    } 

クラスには、格納されている多くのメソッドとプロパティがあります。今はすべて正常に動作しますが、新しいバージョンのプロジェクトクラスを持つ新しいバージョンのアプリケーションをリリースしたい場合、以前のバージョンと互換性がありません。私はそれが設計上の誤りであることを知っています。もちろん、自分で定義したシリアル化を使用しなければならなかったので、この重要なタイプのファイルに対して.NETに依存してはいけません。

私の質問は、以前のシリアル化されたプロジェクトファイルをどのように読むことができますか?私が知っておくべきフォーマットがありますか?.NETはどのようにして最初にシリアライズしましたか?私は顧客に古いファイルフォーマットとの互換性を持たせたいと思っていますが、今は古い保存済みのプロジェクトファイル用のファイルコンバータを書く方法はありません。

おかげで、

エリック

+0

自分の手書きを読むことができません。 :P – Cerebrus

答えて

1

、おそらくあなたはVersion Tolerant Serialization上に読んでください:

ところで、あなたは本当に、すべてのデータがフラッシュされていることを確認するためにストリームを閉じる必要がありますか?

+0

+1、例外がスローされるのを防ぐのを助けながら、これは古いバージョンのフィールドを復元します。古いクラスのデータだけがそのメソッドではなく、シリアライズされていることを覚えておいてください。 – Dabblernl

+0

私はちょうどこれを読んでいる、これはトリックを行う必要があります!ありがとうRichardOD – Enrico

+0

wcfデータコントラクトまたはGoogleプロトコルバッファ(JonまたはMarcs)ははるかに堅牢なソリューションです。 –

1

を使用すると、ソース管理でプロジェクトの古いバージョンを持っていますか?

もしそうなら、それを使って既存のデータを読み込み、新しいコードが正常に読み込めるように、バージョンに優しい方法で書き出すことをお勧めします。今少し遅れ

public void ProjectSerialize(string filename) 
{ 
    using (Stream s = File.Open(filename, FileMode.Create)) 
    { 
     BinaryFormatter b = new BinaryFormatter(); 
     b.Serialize(s, this); 
    } 
} 
+0

こんにちはジョン、 コメントをいただきありがとうございます。もちろんストリームを閉じます。問題は、アプリケーションがすでに顧客で実行されており、すべてのファイルを取得できないということです。私の最初のアイデアは、古いプロジェクトファイルを新しい制御ファイルに変換する小さなコンバータを作ることでした。しかし、元のアプリケーションとまったく同じ名前のアプリケーションだけがファイルを読み取ることができます。 – Enrico

+0

正確に同じ名前のアプリケーションである必要はありませんが、おそらく同じ名前の*アセンブリ*から読み取る必要があります。したがって、以前と同じ名前のクラスライブラリを参照する新しい実行可能ファイルを作成することができます。変換ツールとして別のサブディレクトリに入れてください。 –

関連する問題