- LocCloud
-
要让一个类能够实现串行化,要先让该类支持串行化,经过这样五个步骤:
1:该类派生于CObject,即在该类头文件中申明
2.在该类头文件中添加宏申明:DECLARE_SERIAL(class_name)
3.该类CPP文件中添加实现的宏申明:IMPLEMENT_SERIA(class_name,base_name,版本号)
4重写serial()
5构造一个该类的无参构造函数,
经过这样五个步骤才能使得在该类中正确使用serial()进行数据的串行化
- 余辉
-
CObject
CObject为Microsoft基础类库中主要的基类。它不仅用作库类,例如CFile和CObList的根,而且也是自己编写的类的根。CObject类提供了基本的服务,其中包括: · 支持串行化
· 运行类信息
· 对象诊断输出
· 与收集类兼容
注意:CObject类不支持多继承。派生的类仅仅拥有一个CObject基类,并且CObject在等级体系中必须位于最左边。不过,它也允许在多继承分支的右边有其结构及非CObject派生类。
如果在类的执行与声明过程中使用了可选的宏,那么你将发现CObject派生的主要优点。
第一层次的宏,DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC,允许在等级体系中运行时访问类名及位置。这样,将允许依次地进行有意义的诊断转储。
第二层次的宏,DECLARE_SERIAL和IMPLEMENT_SERIAL,包含了第一层次宏的所有功能,并且能够使对象到“档案”有效地串行化。
如果要了解有关通常条件下派生的Microsoft基础类和C++类,以及如何使用CObject类的更多信息,请参阅联机文档“Visual C++程序员指南”中的“CObject类主题”及“串行化(对象永久化)”。
#include <afx.h>
CObject类的成员
构造函数 CObject 缺省的构造函数
CObject 拷贝构造函数
operator new 特别的new操作
operator delete 特别的delete操作
operator = 赋值操作
诊断 AssertValid 证实该对象的完整性
Dump 进行该对象的诊断转储
串行化 IsSerializable 测试该对象是否被串行化
Serialize 从档案文件中装载或向档案文件中存储某对象
多面性 GetRuntimeClass 返回对应该对象类的CRuntimeClass结构
IsKindOf 测试该对象是否与指定类相关联
CObject::Serialize
virtual void Serialize( CArchive& ar );
throw( CMemoryException );
throw( CArchiveException );
throw( CFileException );
参数: ar 被串行化的CArchive对象。
说明:
从档案文件中读取该对象或向档案文件中写入该对象。
必须为希望串行化的每个类覆盖Serialize。被覆盖的Serialize首先必须调用基类的Serialize函数。
在类的声明中必须使用DECLARE_SERIAL宏,并且在类的执行过程中也必须使用IMPLEMENT_SERIAL宏。
使用CArchive::IsLoading或CArchive::IsStoring函数,用于决定是否装载或存储了档案文件。
通过CArchive::ReadObject和CArchive::WriteObject来调用Serialize函数。这些函数与CArchive插入操作符(<<)和抽出操作符(>>)相关联。
如果要了解有关串行化的例子,请参阅联机文档“Visual C++程序员指南” 中的“串行化(对象永久化)”。
示例:请参阅ObList::CObList,了解所有CObject示例中使用的CAge类。
// example for CObject::Serialize
void CAge::Serialize( CArchive& ar )
{
CObject::Serialize( ar );
if( ar.IsStoring() ) ar << m_years;
else ar >> m_years;
}
CArchive::IsStoring
BOOL IsStorng( ) const;
返回值:
如果正在存储归档文件,则返回非零值,否则为0。
说明:
确定是否正在存储归档文件。这个函数由归档文件类的Serialize函数调用。
如果归档文件的IsStoring状态为非零,则它的IsLoading状态为0,反之亦然。
示例:
int i;
extern CArchive ar;
if(ar.IsStoring( )) ar< else ar>>i;
请参阅:CArchive::IsLoading