■18254 / ) |
Re[6]: 例外処理をするべきか否か |
□投稿者/ 通りすがり (19回)-(2008/05/12(Mon) 12:59:37)
|
...すみません、頭の仕様がアレなのでいろいろ理解できてません。
まず、コンバートとかそれ以前の問題ですが、 > じゃなくって古いバージョンの情報は読み込んだら常に最新版へコンバートするんです。 ってことは、「それが古いかどうか判断する手段」が必要なわけですね。 今考えているクラスではバージョン番号を整数値で保持しているので、その点問題無しです。 逆に、シリアライズするクラスで変更がありそうなクラスには、「それが古いかどうか判断する手段」を持たせなくてはならない、ということですね。
次に、コンバートに関して > class Hoge1 > class Hoge2 > を作ってHoge1を読み込んだら内部でHoge2に変換してしまいます。 ということは、Hoge1は修正(メンバの追加)が入る前のクラス、Hoge2がメンバ追加後のクラスということですよね。 別なクラスなんですよね。 んで、自分をHoge2に変換するための仕組みをHoge1の方に持たせてあげるんですね。
となると、 ・Hoge2はほぼHoge1と同じソースコードになる ・ソースコード中の「Hoge1」を「Hoge2」に置換していく必要がある ということになりますよね。
それは避けられないことなんでしょうか。 もっと楽してできないもんなんでしょうか...。
ちなみに、現在は以下のようなことやっています。 デシリアライズ時に、Get***で存在しない名前で値をとろうとすると例外が投げられて、_hogeがnullのままだからHogeをnewし直してます。 だもんで、新たに追加したメンバのおかげで、それまで保存しといた他の多数の情報が捨てられているんです。 こいつらを生かしてあげたいし、追加されたメンバも適切に初期化したい...。 /* あわよくば最小限の手間で。 */
FileStream fs = null; BinaryFormatter bf = new BinaryFormatter(); try { s = new FileStream(filePath, FileMode.Open); _hoge = bf.Deserialize(fs) as Hoge; } catch (Exception e) { _hoge = null; } if (fs != null) fs.Close(); if (_hoge == null || _hoge.Version != Hoge.LatestVersion) _hoge = new Hoge();
|
|