Serialize问题,请进!

sinhua_ren 2007-07-25 12:05:47
CArray::Serialize(ar)函数,怎么不调用元素的Serialize(ar)?
帮忙看看哪出问题了

////////////////UserInfo.H
class CUserInfo : public CObject
{
DECLARE_SERIAL(CUserInfo);
public:
CUserInfo();
virtual ~CUserInfo();
public:
CString strName;
CString strAddress;
public:
CUserInfo& operator=(const CUserInfo& p); //重载=运算符
CUserInfo(const CUserInfo& p); //拷贝构造函数
virtual void Serialize(CArchive& ar); //重载Serialize

};
//////////////UserInfo.CPP
IMPLEMENT_SERIAL(CUserInfo,CObject,0)
CUserInfo::CUserInfo(){
}
CUserInfo::~CUserInfo(){
}
CUserInfo& CUserInfo::operator =(const CUserInfo& p)
{
strName=p.strName;
strAddress=p.strAddress;
return *this;
}
CUserInfo::CUserInfo(const CUserInfo& p)
{
*this=p;
}
void CUserInfo::Serialize(CArchive& ar)
{
if(ar.IsStoring())
{
ar<<strName<<strAddress;
}
else
{
ar>>strName>>strAddress;
}
}

////////////在文档类定义m_array
CArray<CUserInfo,CUserInfo&> m_array;

void CMyDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
}
else
{
}
m_array.Serialize(ar); ////元素CUserInfo::Serialize没有被调用
}
...全文
170 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyg_zy 2007-07-25
  • 打赏
  • 举报
回复
我说的"m_array派生于CObject,但没有重载Serialize函数"是错误的。
CArray派生于CObject类,重载Serialize函数,但它不会调用你的对象的Serialize函数,因为它是一个模板类,它不知道你给它的数据类型是什么,更不可能知道你的数据对象里有Serialize函数了。
看看CArray模板类的代码你就明白了:
template<class TYPE, class ARG_TYPE>
void CArray<TYPE, ARG_TYPE>::Serialize(CArchive& ar)
{
ASSERT_VALID(this);

CObject::Serialize(ar);
if (ar.IsStoring())
{
ar.WriteCount(m_nSize);
}
else
{
DWORD_PTR nOldSize = ar.ReadCount();
SetSize(nOldSize, -1);
}
SerializeElements<TYPE>(ar, m_pData, m_nSize);
}

template<class TYPE>
void AFXAPI SerializeElements(CArchive& ar, TYPE* pElements, INT_PTR nCount)
{
ASSERT(nCount == 0 ||
AfxIsValidAddress(pElements, (size_t)nCount * sizeof(TYPE)));

// default is bit-wise read/write
if (ar.IsStoring())
{
TYPE* pData;
UINT_PTR nElementsLeft;

nElementsLeft = nCount;
pData = pElements;
while( nElementsLeft > 0 )
{
UINT nElementsToWrite;

nElementsToWrite = UINT(min(nElementsLeft, INT_MAX/sizeof(TYPE)));
ar.Write(pData, nElementsToWrite*sizeof(TYPE));
nElementsLeft -= nElementsToWrite;
pData += nElementsToWrite;
}
}
else
{
TYPE* pData;
UINT_PTR nElementsLeft;

nElementsLeft = nCount;
pData = pElements;
while( nElementsLeft > 0 )
{
UINT nElementsToRead;

nElementsToRead = UINT(min(nElementsLeft, INT_MAX/sizeof(TYPE)));
ar.Read(pData, nElementsToRead*sizeof(TYPE));
nElementsLeft -= nElementsToRead;
pData += nElementsToRead;
}
}
}
lyg_zy 2007-07-25
  • 打赏
  • 举报
回复
因为虽然 m_array派生于CObject,但没有重载Serialize函数,正确的做法如下:
void CMyDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring() )
{
long n = myArray.GetCount();
ar << n;
for( i=0 ; i < n ;i++ )
{
CUserInfo& userInfo = m_array.ElementAt(i);
userInfo.Serialize(ar);
}
}
else
{
long n = 0 ;
ar >> n;
for( i=0;i < n;i++ )
{
CUserInfo userInfo ;
userInfo.Serialize( ar );
m_array.Add( userInfo );
}
}
}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧