最近看msdn自己练习了一下序列化,出现如下问题:
自己建了一个类:继承于cobject,包括 CString m_title; CString m_content;
CTime m_time;三个成员变量。
一个构造函数:
CMyevent::CMyevent()
{
m_title="nothing";
m_content="nothing";
m_time=CTime::GetCurrentTime();
}
一个序列化函数:
void CMyevent::Serialize(CArchive& ar)
{
CObject::Serialize(ar);
if (ar.IsStoring()) {
ar<<m_title<<m_content<<m_time;
}
else {
ar>>m_title>>m_content>>m_time;
}
}
我在文档类的构造函数中进行如下操作:
(m_obarray是一个文档类的中定义的CObArray类的对象)
m_obarray.Add(new CMyevent());
char* pszFileName = "c:\\file.txt";
CFile myFile;
CFileException fileException; if ( !myFile.Open( pszFileName, CFile::modeCreate |
CFile::modeReadWrite, &fileException ) )
{
TRACE( "Can't open file %s, error = %u\n",
pszFileName, fileException.m_cause );
}
CArchive arstore(&myFile,CArchive::store);
m_obarray.Serialize(arstore);
arstore.Close();
myFile.Close();
if ( !myFile.Open( pszFileName, CFile::modeCreate |
CFile::modeReadWrite, &fileException ) )
{
TRACE( "Can't open file %s, error = %u\n",
pszFileName, fileException.m_cause );
}
CArchive arload(&myFile,CArchive::load);
m_obarray.Serialize(arload);
arload.Close();
myFile.Close();
按ctrl+F5后出现提示:建立空文档失败,将m_obarray.Serialize(arload);去掉后就没事了,这就是说问题出在这里??
请问:出错的原因是因为CMyevent类的序列化函数出错还是因为CObArray类的错误??
我实在是搞不出来了,请大家指点指点
自己建了一个类:继承于cobject,包括 CString m_title; CString m_content;
CTime m_time;三个成员变量。
一个构造函数:
CMyevent::CMyevent()
{
m_title="nothing";
m_content="nothing";
m_time=CTime::GetCurrentTime();
}
一个序列化函数:
void CMyevent::Serialize(CArchive& ar)
{
CObject::Serialize(ar);
if (ar.IsStoring()) {
ar<<m_title<<m_content<<m_time;
}
else {
ar>>m_title>>m_content>>m_time;
}
}
我在文档类的构造函数中进行如下操作:
(m_obarray是一个文档类的中定义的CObArray类的对象)
m_obarray.Add(new CMyevent());
char* pszFileName = "c:\\file.txt";
CFile myFile;
CFileException fileException; if ( !myFile.Open( pszFileName, CFile::modeCreate |
CFile::modeReadWrite, &fileException ) )
{
TRACE( "Can't open file %s, error = %u\n",
pszFileName, fileException.m_cause );
}
CArchive arstore(&myFile,CArchive::store);
m_obarray.Serialize(arstore);
arstore.Close();
myFile.Close();
if ( !myFile.Open( pszFileName, CFile::modeCreate |
CFile::modeReadWrite, &fileException ) )
{
TRACE( "Can't open file %s, error = %u\n",
pszFileName, fileException.m_cause );
}
CArchive arload(&myFile,CArchive::load);
m_obarray.Serialize(arload);
arload.Close();
myFile.Close();
按ctrl+F5后出现提示:建立空文档失败,将m_obarray.Serialize(arload);去掉后就没事了,这就是说问题出在这里??
请问:出错的原因是因为CMyevent类的序列化函数出错还是因为CObArray类的错误??
我实在是搞不出来了,请大家指点指点
CMyevent里很正常
m_obarray.Serialize(arstore);
arstore.Close();
myFile.Close();
if ( !myFile.Open( pszFileName, CFile::modeCreate |
CFile::modeReadWrite, &fileException ) )
{
TRACE( "Can't open file %s, error = %u\n",
pszFileName, fileException.m_cause );
}
CArchive arload(&myFile,CArchive::load);
m_obarray.Serialize(arload);
arload.Close();
--------------------------------------->我给一点伪代码int size = 0;if (ar.IsStoring()) {
size = m_obarray.size();
ar<< size;
for(int i=0;i<size;i++)
{
m_obarray.Serialize(ar);
}
}else
{
ar>> size;
m_obarray.setsize(size);
m_obarray.Serialize(ar);}
m_obarray.Add(new CMyevent());
char* pszFileName = "c:\\file.txt";
CFile myFile;
CFileException fileException; if ( !myFile.Open( pszFileName, CFile::modeCreate |
CFile::modeReadWrite, &fileException ) )
{
TRACE( "Can't open file %s, error = %u\n",
pszFileName, fileException.m_cause );
}
int sizestore = 0; CArchive arstore(&myFile,CArchive::store);
sizestore = m_obarray.GetSize();
arstore<<sizestore;
for(int i=0;i<sizestore;i++){
m_obarray.Serialize(arstore);
}
arstore.Close();
myFile.Close();
if ( !myFile.Open( pszFileName, CFile::modeCreate |
CFile::modeReadWrite, &fileException ) )
{
TRACE( "Can't open file %s, error = %u\n",
pszFileName, fileException.m_cause );
}
CArchive arload(&myFile,CArchive::load);
int sizeload;
arload>>sizeload;
m_obarray.SetSize(sizeload);
m_obarray.Serialize(arload); arload.Close();
myFile.Close();
但还是提示:建立空文档失败阿
我理解得不对吗??
首先存对象个数,然后根据个数,一个对象一个对象的存,不要调用m_obarray.Serialize(arload);
而是,每次取多一个m_obarray中的一个元素存,m_obarray[i].Serialize(ar);注意是[i].读的时候,先读出个数size,然后,分m_obarray分配size。如果不分配size,则需要new 一个object就addnew,如果先分配size了,就只接用m_obarray[i] = new CMyevent();一定要记住m_obarray只一个对象指针数组,本身不能存信息。而要通过对象指针数组保存new出来的对象new CMyevent();再用这个对象来Serialize我们前面保存的文件。
我给一点代码,好好体会。
---------------------------->
int count = 0;
if (ar.IsStoring())
{ // storing code
count = m_iconWnds.GetCount();
POSITION pos = m_iconWnds.GetHeadPosition();
ar<<count;
for(int i=0;i<count;i++)
{
CIconWnd* pItem = (CIconWnd*)m_iconWnds.GetNext(pos);
pItem->Serialize(ar); }
}
else
{
ar>>count;
if(count == 0) return;
for(int i=0;i<count;i++)
{
ICONWNDINFO info;
info.reset();
info.Serialize(ar);
AddIconWnd(&info); }
}