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

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,"青森"
これで、先頭の数字(バージョン番号)を読み取って、そのときのバージョンだったら、データはどう並んでいたかを判断します。
ただ、これは、過去のバージョンの配置をすべて覚えておく必要がありますから、汎用性には欠けます。
ご回答くださり,ありがとうございます。
XML を使うというのは,思いつきもしないアイデアでした!
ソフトウェアを根本的に改造しても,データが使いまわせそうです。
大変,興味深く感じましたので XML の書物を購入した次第です。
汎用性に富む方法を勉強することができました。
早速,小さなアプリを作って XML 実装の練習をしてみたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Excel(エクセル) Excelで全クラスのランキング表を作成したい 4 2022/05/24 15:28
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- 学校 助けるというよりかは聞いてアドバイスを欲しいです。ただ聞いてくれるだけでもいい。今まで結構な数のアニ 2 2023/05/16 19:44
- Excel(エクセル) 別シートに毎回異なるデータをコピーする 7 2022/06/24 09:02
- その他(プログラミング・Web制作) Pythonで複数のメソッドをまとめて管理する方法について 1 2023/03/30 00:01
- Excel(エクセル) エクセルでcsvファイルを開いてVBAを使いたい 7 2022/04/28 11:12
- 学校 10年間ずっと問題児ですが。 4 2023/05/03 13:12
- 友達・仲間 いじめ被害者だった男友達 1 2022/09/03 22:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA チェックボックスをオーバ...
-
MRUの一時回避 VC++2008 MFC
-
メンバ変数のサイズの増加
-
モーダレスなメッセージボック...
-
(UWSC) 「#32770」の意味わかり...
-
FriendとPublicの違い。。。
-
このコンパイルエラーの意味に...
-
C# 別プロジェクトのフォームを...
-
【ASP.NET】 独自で作成したク...
-
DLLからEXEのクラスを呼び出す...
-
[MFC] CWnd::MessageBoxの警告...
-
MFC CSplitter内にコントロール...
-
不要になった、普通の構造体の処理
-
VB.NETでのEnumの使用について
-
MFCのドラッグ&ドロップについて
-
【C++】相互参照
-
既定のコンストラクタがない?
-
継承を重ねた場合のコストはど...
-
イベントにAddHandlerされてい...
-
MFC 分割ウィンドウのそれぞれ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA チェックボックスをオーバ...
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
イベントにAddHandlerされてい...
-
(UWSC) 「#32770」の意味わかり...
-
ボタンのオーナードローについて
-
MFCアプリのコマンドラインでパ...
-
ダイアログ表示時にチェックボ...
-
【ASP.NET】 独自で作成したク...
-
エディットコントロールでEnter...
-
MFCのドラッグ&ドロップについて
-
オーバーライド関数の呼び出し...
-
DataGridViewのセルに斜線を引...
-
MFCのCListCtrlでスクロールを検出
-
C++ protectedにアクセス不可
-
ダイアログクラスのコントロー...
-
クラスのアドレスを引数として...
-
エディットコントロールのイベ...
-
個々の関数について継承してい...
-
WindowsAPIのリストビューの...
おすすめ情報