はじめまして。
"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ランキング
-
ArduinoのジャイロモジュールMP...
-
C言語をコンパイルするとコンピ...
-
mallocについて
-
C言語 列挙型(enum型)変数について
-
scipy っていうのをいれようと...
-
Int('1234') で、strをかんたん...
-
あなたは、Excelはどうやって学...
-
パイソンの
-
VisualStudio2022でC言語プログ...
-
pythonの質問です。
-
どなたかこのプログラミングを...
-
chatgptでつくってもらったコー...
-
c言語
-
プログラミング言語の制作方法...
-
終端記号、非終端記号とは
-
License='MIT' ってなんでmitな...
-
VisualStudioでのプログラミン...
-
Notepad++の関数リスト表示でC...
-
プログラミングについての質問...
-
卒業研究でよく分からないとこ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
(UWSC) 「#32770」の意味わかり...
-
クラスのアドレスを引数として...
-
ダイアログ表示時にチェックボ...
-
イベントにAddHandlerされてい...
-
【ASP.NET】 独自で作成したク...
-
MFCアプリのコマンドラインでパ...
-
DebugクラスとTraceクラスの違い
-
ボタンのオーナードローについて
-
OnInitDialog()の関数の組み込み方
-
IncludeではなくClassで宣言す...
-
関数の呼び出し元の検索
-
このコンパイルエラーの意味に...
-
C++ protectedにアクセス不可
-
C++で継承元のクラスの代入演算...
-
DataGridViewのセルに斜線を引...
-
C#で通常のbuttonコントロール...
-
エディットコントロールのイベ...
-
CMainFrameクラスの使い方
おすすめ情報