内容有一点二多,请大家帮忙仔细看看,在此感谢首先是头文件的定义:
class CParamInfo : public CObject
{
DECLARE_SERIAL(CParamInfo)
public:
CParamInfo() {}
virtual ~CParamInfo() {}
public:
char m_sid[LENGTH_DATAID];
char m_describe[LENGTH_DATANAME];
BYTE m_paramtype;
BOOL m_bdefparamname;
public:
virtual void Serialize(CArchive& ar);
};
typedef CTypedPtrList<CObList,CParamInfo*> CParamInfoList;//
class CUnitInfo : public CObject
{
     DECLARE_SERIAL(CUnitInfo)
public:
CUnitInfo(){}
virtual ~CUnitInfo()
{
POSITION pos = m_ParamList.GetHeadPosition();
while(pos)
{
CParamInfo* pParam = m_ParamList.GetAt(pos);
m_ParamList.RemoveAt(pos);
delete pParam;
pos = m_ParamList.GetHeadPosition();
}
}
public:
char m_sid[LENGTH_DATAID];
char m_describe[LENGTH_DATANAME];
BOOL m_bdefcoltitle;
CString m_coltitle;
CParamInfoList m_ParamList;
public:
virtual void Serialize(CArchive& ar);
};
typedef CTypedPtrList<CObList,CUnitInfo*> CUnitInfoList;//
class CNormalReport : public CObject
{
DECLARE_SERIAL(CNormalReport)
public:
CNormalReport(){}
virtual ~CNormalReport()
{
CUnitInfo* pUnit = NULL;
while(m_UnitList.GetCount())
{
pUnit = m_UnitList.RemoveHead();
delete pUnit;
}
};public:
DWORD m_dwReportID;
CString m_szReportName;
CString m_szReportTitle;
BOOL m_bDefReportTitle;
BOOL m_bComplete;
CUnitInfoList m_UnitList;
CStringList m_statlist;
public:
virtual void Serialize(CArchive& ar);
};
typedef CTypedPtrList<CObList,CNormalReport*> CNormalReportList;//
在CPP中
以上分别从CObject继承并定义了三个类,并实例化了一个CNormalReportList g_RptList
这个是保存代码,导出的代码差不多,只是把store 改成 load
BOOL CDlgReportDefine::SaveReportInfo()
{
CString szFile;
szFile.Format("%s\\Report\\Report.Dat", g_szAppDir);
CFile file;
if(!file.Open(szFile, CFile::modeCreate | CFile::modeWrite ))
{
return FALSE;
}
CArchive ar(&file, CArchive::store);
TRY
{
g_RptList.Serialize(ar);
}
CATCH_ALL(e)
{
ar.Close();
file.Close();
e->Delete();
return FALSE;
}
END_CATCH_ALL
ar.Close();
file.Close();
return TRUE;
}以下为三个类序列化代码,中间我省去了一些成员变量的析入析出
void CNormalReport::Serialize(CArchive& ar)
{
CObject::Serialize( ar );
if (ar.IsStoring())
{
ar << m_ReportID;
ar << m_ReportName;
ar << m_ReportTitle;
ar << m_bDefReportTitle;
ar << m_bComplete;
}
else
{
ar >> m_ReportID;
ar >> m_ReportName;
ar >> m_ReportTitle;
ar >> m_bDefReportTitle;
ar >> m_bComplete;
}
m_UnitList.Serialize(ar);
m_statlist.Serialize(ar);
}void CUnitInfo::Serialize(CArchive& ar)
{
CObject::Serialize( ar );
CString m_szsid, m_szdescribe; if (ar.IsStoring())
{
m_szsid = m_sid;
m_szdescribe = m_describe;
ar << m_szsid;
ar << m_szdescribe;
ar << m_bdefcoltitle;
ar << m_coltitle;
m_ParamList.Serialize(ar);
}
else
{
ar >> m_szsid;
ar >> m_szdescribe;
strcpy(m_sid, m_szsid);
strcpy(m_describe, m_szdescribe);
ar >> m_bdefcoltitle;
ar >> m_coltitle;
m_ParamList.Serialize(ar);
}
}void CParamInfo::Serialize(CArchive& ar)
{
CObject::Serialize( ar );
CString m_szsid, m_szdescribe; if (ar.IsStoring())
{
m_szsid = m_sid;
m_szdescribe = m_describe;
ar << m_szsid;
ar << m_szdescribe;
ar << m_dotnum;
ar << m_colwidth;
ar << m_paramtype;
ar << m_bdefparamname;
}
else
{
ar >> m_szsid;
ar >> m_szdescribe;
ar >> m_dotnum;
ar >> m_colwidth;
ar >> m_paramtype;
ar >> m_bdefparamname; strcpy(m_sid, m_szsid);
strcpy(m_describe, m_szdescribe);
}
}现在的问题是保存的时候没有问题,用UltraEdit32打开看后内容一致,可是在导出的时候就有问题了。
在调用g_RptList.Serialize(ar)时,Debug信息输出
Warning: Cannot load CNormalReport from archive.  Class not defined.
CArchive exception: badClass.完了,就这些,谢谢大家有耐心看到这里哈。呵呵,如果有什么不明白的可以直接跟贴,因为量太多了,所以我裁减了一些代码