CArrayのシリアライズについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kame
記事: 6
登録日時: 9年前

CArrayのシリアライズについて

#1

投稿記事 by kame » 9年前

以下の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); // 何かしら復元されるが、配列の中身が正しくない。
	}
}

f8

Re: CArrayのシリアライズについて

#2

投稿記事 by f8 » 9年前

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は久しく触っていないので。すみません。(^_^;

kame
記事: 6
登録日時: 9年前

Re: CArrayのシリアライズについて

#3

投稿記事 by kame » 9年前

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

閉鎖

“C言語何でも質問掲示板” へ戻る