2011-05-10 26 views
3

をアップグレードし、私はにBinaryFormatterオブジェクトグラフは、私のオブジェクトグラフで

[Serializable] 
public class Dog 
{ 
    string _name; 
} 

のようなものを持っていると私は犬に犬と参照のリストのすべての種類を持っています。

犬はソフトウェア作成の初めに動物だったので、基本クラスは必要ありませんでした。さて、その必要性が浮上していると、今私は

[Serializable] 
public class Dog : Animal 
{ 
    public void Bark() { } 
} 

[Serializable] 
public class Cat : Animal 
{ 
    public void DoTheCatStuff() { } 
} 

[Serializable] 
public class Animal 
{ 
    string _name; 
} 

BUTがしたい:私は古いアーカイブをデシリアライズするとき、私はすべての犬を持っていないし。彼らはアーカイブからまったくデシリアライズしませんでした。

私は何をしたいのですか?新しいクラス階層が必要になり、古いDogから新しいTheDogに手動でオブジェクトをコピーする場合は、可能であればそれを避けたいです。

EDIT:一部の.NETガー、なぜ私は犬がいませんか?

+0

上記のコードでBinaryFormatter(シリアライズ、クラス定義の変更、デシリアライズ)を使って簡単なテストを実行しましたが、何の問題もありませんでした。上記のコードが問題であると確信していますか? –

+0

リストをオブジェクトグラフに追加してみてください... –

+0

@ダニエル、リストで繰り返しましたが、それでもまだ再現できませんでした。 –

答えて

0

これは興味深いものです。

私は新しいフォーマットに書き出す古いクラスフォーマット、または新しいクラス階層に変換して理解できる中間フォーマットを持つアップグレードプログラムを書いています。

おそらく、古いアーカイブのバイナリ形式をデシリアライズすることによって、XMLをシリアル化してから、LinqToXmlを使用して新しい階層にオブジェクトを作成することができます。

+0

私は現在、グラフのルートにint _serialを維持し、シリアルが最新のものでないときには何かを行うという方法でアップグレードを行っています。これまでのところ(18ヶ月間、10サイト、20件のアップグレード)、外部アップグレード手順は必要ありませんでした。 –

+0

この問題を引き起こしたのは、最近の「犬」のサブクラスですか?私はいくつかの 'バージョン寛容シリアル化'の属性が、値を処理するコールバックを追加することによって役立つかもしれないかと思っています:http://msdn.microsoft.com/en-us/library/ms229752(v=vs.80) .aspx –

+0

.net2.0を使用していますが、このドキュメントではVersionAdded属性を処理していないことを示しています。とにかく、私は記事のガイドラインに従わなかったし、これまでのところシリアライゼーションに問題はなかった。 –