ページ 1 / 1
CArrayのシリアライズについて
Posted: 2016年7月04日(月) 18:25
by kame
以下のCArrayをSerializeメソッドを使って保存してみたのですが、復元が上手くいきません。
CArrayの中にCArrayを持っている場合はこの書き方は無理なのでしょうか?
また、上手くいく方法があればアドバイスください。
環境はVS2013pro MFCです。よろしくお願い致します。
コード:
CArray<CArray<float>> CArrayTest;
~CArrayTestに値格納~
// ↓VSにより自動生成されたSDIアプリケーション内
void CTestDoc::Serialize(CArchive& ar)
{
if(ar.IsStroing())
{
CArrayTest.Serialize(ar); // シリアライズ
}
else
{
CArrayTest.Serialize(ar); // 何かしら復元されるが、配列の中身が正しくない。
}
}
Re: CArrayのシリアライズについて
Posted: 2016年7月05日(火) 20:45
by f8
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とか?
}
}
}
動くコードを提示できれば良いのですが環境がなく、しかもMFCは久しく触っていないので。すみません。(^_^;
Re: CArrayのシリアライズについて
Posted: 2016年7月06日(水) 22:56
by kame
f8さん
返信ありがとうございます。
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
SerializeはCArrayのベースクラスであるCObjectに仮想関数として定義されています。
仮想関数は派生したクラスで実装してね、という意味になります。
私はCArrayクラスでSerializeがオーバーライドされているものと思っていたのですが、、、
そういえばMFCはソースコードが添付されていたのでCArrayはどうなっているのか見てみますm(_ _)m