プロが教える店舗&オフィスのセキュリティ対策術

はじめまして。
"Hello world!" を勉強してから半年ほどの C++ 初心者です。

Visual Studio.NET 2003 で MFC でアプリを開発しています。

自作したクラス(これは CObject クラスを継承してます)に
Serialize をオーバーライドして,クラスのファイル読み書きを
簡単に行えるようにしています。

MFC は素晴らしいと,初心者ながらに感動しております。

いま Serialize に関する問題に直面しています。

クラスにメンバ(のデータ)を増やしたときのことです。

クラスの Serialize を記述しなおして,正しく動作するようにはなりました。
ところが,(当然ですが)記述しなおす前の Serialize で保存したファイルを読むと
「予期しないファイル形式です」となります。

このような場合に,一般的なエラー回避方法はあるのでしょうか?

クラスにメンバをたった 1 つつけ加えただけで,エラーが出て不便に思います。

クラスにメンバをつけくわえることは,アプリのバージョンアップ等でも必要だと思うのですが。。。

初心者につき,間抜けな質問をしているかもしれませんが,ご教授いただければ幸いです。

A 回答 (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などで確認してください
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/12/13 11:59

当然といえば当然なのですが……


このような状況に対処するためには、ファイルの中にあるデータ自体に、「それが何ものなのか」を明示しておく必要があります。

例えば、
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,"青森"

これで、先頭の数字(バージョン番号)を読み取って、そのときのバージョンだったら、データはどう並んでいたかを判断します。
ただ、これは、過去のバージョンの配置をすべて覚えておく必要がありますから、汎用性には欠けます。
    • good
    • 0
この回答へのお礼

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

XML を使うというのは,思いつきもしないアイデアでした!
ソフトウェアを根本的に改造しても,データが使いまわせそうです。
大変,興味深く感じましたので XML の書物を購入した次第です。

汎用性に富む方法を勉強することができました。

早速,小さなアプリを作って XML 実装の練習をしてみたいと思います。

お礼日時:2006/12/13 11:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!