C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 36 を表示中)
■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();

返信 編集キー/


管理者用

- Child Tree -