• ベストアンサー

Serialize で困ってます!!

はじめまして。 "Hello world!" を勉強してから半年ほどの C++ 初心者です。 Visual Studio.NET 2003 で MFC でアプリを開発しています。 自作したクラス(これは CObject クラスを継承してます)に Serialize をオーバーライドして,クラスのファイル読み書きを 簡単に行えるようにしています。 MFC は素晴らしいと,初心者ながらに感動しております。 いま Serialize に関する問題に直面しています。 クラスにメンバ(のデータ)を増やしたときのことです。 クラスの Serialize を記述しなおして,正しく動作するようにはなりました。 ところが,(当然ですが)記述しなおす前の Serialize で保存したファイルを読むと 「予期しないファイル形式です」となります。 このような場合に,一般的なエラー回避方法はあるのでしょうか? クラスにメンバをたった 1 つつけ加えただけで,エラーが出て不便に思います。 クラスにメンバをつけくわえることは,アプリのバージョンアップ等でも必要だと思うのですが。。。 初心者につき,間抜けな質問をしているかもしれませんが,ご教授いただければ幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

MFCでシリアル化しているなら IMPLEMENT_SERIAL(CMyObject, CObject, 1) といった記述があると思います この3番目の引数を VERSIONABLE_SCHEMA|1 といったようにします # |1 は派生バージョンがある場合に2 3 などと増やしていきます アーカイブからの読み込み時に if ( ar.IsLoading() ) {  nVersion = ar.GetObjectSchema();  switch( nVerion )  {   case 0:    // 1つ古いバージョン    break;   case 1:    // 現行バージョン    break;   default:    // バージョン不明  } } といった具合に処理します GetObjectSchema()は IsLoadingがTRUEを返す場合だけ有効です 詳細は MSDNなどで確認してください

k1220011_2005
質問者

お礼

ご回答くださり,ありがとうございます。

その他の回答 (1)

回答No.1

当然といえば当然なのですが…… このような状況に対処するためには、ファイルの中にあるデータ自体に、「それが何ものなのか」を明示しておく必要があります。 例えば、 START: NAME="太郎" AGE=26 のようにメンバの(または関連する)名前も一緒に保存するとか。 最近このような用途では、XML というのが主流かなと思います。 <data> <name>太郎</mame> <age>26</age> </data> <data> <name>次郎</name> <age>33</age> </data> こんな形でファイルに書き出すようにしておけば、後で見たときに、少なくとも、このデータはどのメンバーに割り振ればいいかが判断できます。 存在しない項目の初期化なども、読み込み時にやります。 もう少し安直にやろうと思えば、各データの先頭にバージョンでもつけておけばいいかもしれません。 1,"太郎",26 1,"次郎",33 (バージョン1のデータには、出身地がない) 2,"三郎",18,"北海道" 2,"四郎",42,"青森" これで、先頭の数字(バージョン番号)を読み取って、そのときのバージョンだったら、データはどう並んでいたかを判断します。 ただ、これは、過去のバージョンの配置をすべて覚えておく必要がありますから、汎用性には欠けます。

k1220011_2005
質問者

お礼

ご回答くださり,ありがとうございます。 XML を使うというのは,思いつきもしないアイデアでした! ソフトウェアを根本的に改造しても,データが使いまわせそうです。 大変,興味深く感じましたので XML の書物を購入した次第です。 汎用性に富む方法を勉強することができました。 早速,小さなアプリを作って XML 実装の練習をしてみたいと思います。