以下のCArrayをSerializeメソッドを使って保存してみたのですが、復元が上手くいきません。
CArrayの中にCArrayを持っている場合はこの書き方は無理なのでしょうか?
また、上手くいく方法があればアドバイスください。
環境はVS2013pro MFCです。よろしくお願い致します。
CArrayのシリアライズについて
Re: CArrayのシリアライズについて
保存は正しくできているのか確認はされたのでしょうか?kame さんが書きました: 以下のCArrayをSerializeメソッドを使って保存してみたのですが、復元が上手くいきません。
(恐らく期待した値は書き込まれていないと思います)
SerializeはCArrayのベースクラスであるCObjectに仮想関数として定義されています。
仮想関数は派生したクラスで実装してね、という意味になります。
この辺は調べてもらうとして、貼り付けられたコードを見るとCObject::Serializeはオーバライドされていないですよね?
CObject::Serializeをオーバライドしないのであれば以下のような感じで実装してみてください。
(最初はCArray<int>などの単純なデータで試してみる)
// CArray<int> m_hoge の場合の疑似コード
void CXxxxDoc::Serialize(CArchive& ar)
{
m_hoge.Serialize(ar); // これもあった方がいいのかな(ベースクラスのSerializeを実行)
if(ar.IsStoring()) {
ar << m_hogeに格納されたデータの個数;
for(int i = 0; m_hogeに格納されたデータの個数; i++) {
ar << m_hogeに格納されたデータ[i];
}
}
else {
int nsize, value;
ar >> nsize; //これから読み出すデータの個数
// TODO: 一応、ここでm_hogeを空っぽにする(RemoveAllとか)
for(int i = 0; i < nsize; i++) {
ar >> value;
m_hogeにvalueを追加; // Addとか?
}
}
}
Re: CArrayのシリアライズについて
f8さん
返信ありがとうございます。
CArray<int>を試したところ正常に保存/復元できました。
【出力】
****sditestdoc.cpp(90) : atlTraceGeneral - 1
****sditestdoc.cpp(90) : atlTraceGeneral - 2
****sditestdoc.cpp(90) : atlTraceGeneral - 3
そういえばMFCはソースコードが添付されていたのでCArrayはどうなっているのか見てみますm(_ _)m
返信ありがとうございます。
CArray<int>を試したところ正常に保存/復元できました。
void CSDITestDoc::Serialize(CArchive& ar)
{
CArray<int> cArrayInt;
if (ar.IsStoring())
{
cArrayInt.Add(1);
cArrayInt.Add(2);
cArrayInt.Add(3);
cArrayInt.Serialize(ar);
}
else
{
cArrayInt.Serialize(ar);
for (int i = 0; i < cArrayInt.GetSize(); i++)
{
TRACE("%d\n", cArrayInt[i]);
}
}
}
****sditestdoc.cpp(90) : atlTraceGeneral - 1
****sditestdoc.cpp(90) : atlTraceGeneral - 2
****sditestdoc.cpp(90) : atlTraceGeneral - 3
私はCArrayクラスでSerializeがオーバーライドされているものと思っていたのですが、、、SerializeはCArrayのベースクラスであるCObjectに仮想関数として定義されています。
仮想関数は派生したクラスで実装してね、という意味になります。
そういえばMFCはソースコードが添付されていたのでCArrayはどうなっているのか見てみますm(_ _)m