1.对象的序列化概述
a.什么对象的序列化?
对象的序列化就是可以把一个对象暂时保存在一个CArchive 对象中,并可以随时从该CArchive对象中读取出该对象。因此对象的序列化可以永久保存一个对象,并在合适的时候读出,使对象具有持久性.
为实现对象的持久性,通常多以字节流的形式将记录对象状态的数据存放到磁盘上,这种将状态数据保存到磁盘和从磁盘恢复到内存的过程称为序列化
b.是不是所有的对象都能序列化?
否,只有符合一定条的类的对象才能够被序列化,可以用CObject类的IsSerializable含数来断定一个对象是否可以被序列化。
c.怎样使某一个类的对象可以被序列化?
要使一个类的所有对象都可以被序列化,
1.必须在该类的头文件中DECLARE_SERIAL宏
2.并且在实现文件中必须包括IMPLEMENT_SERIAL宏.
3.该类应该要有一个默认的构造含数
DECLARE_SERIAL与IMPLEMENT_SERIAL宏的基本用法如下:
DECLARE_SERIAL( class_name ) //参数为类名
IMPLEMENT_SERIAL( class_name, base_class_name, wSchema )
第一个参数为类名 第二个参数为该类的基类名 第三个参数为该类的特定整型标识,该标识将用来解序(重新实例化),该参数不能设为-1;
例如:
SerialClass.h
class CSerialClass : public CObject
{
DECLARE_SERIAL(CSerialClass) //包含此宏
// Construction
public:
CSerialClass();
}
d.如何序列化一个特定的对象
Reads or writes this object from or to an archive.
可以使用CObject的Serialize方法实现对象的序列化,它可以从Archive对象中序列化对象
为了使类的对象序列化必须重载CObject的Serialize方法,实现该方法时必须先调用它的基类的Serialize方法
//exaple of Serialize
void CAge::Serialize(CArchive& ar)
{
CObject::Serialize( ar );
if(ar.IsStoring())
ar << m_years;
else
ar >> m_years;
}
3.创建持久类实例
为了使一个类的对象成为持久的,可以自定义一个持久类,将持久性数据的存储和加载的工作交由自定义类自己去完成。这种处理方式也更加符合面向对象的程序设计要求。可以通过下面几个基本步骤来创建一个能序列化其成员变量的自定义持久类:
1. 直接或间接从CObject类派生出一个新类。
2. 在类的声明部分包含MFC的DECLARE_SERIAL宏,该宏只需要将类名作为参数。
3. 重载基类的Serialize()函数,并添加对数据成员进行序列化的代码。
4. 如果构造函数没有一个空的缺省的构造函数(不含任何参数),为其添加一个。
5. 在类的实现部分,添加MFC的IMPLEMENT_SERIAL宏。该宏需要三个参数:类名,基类名和一个方案号。 其中方案号是一个相当于版本号的整数,每当改变了类的序列化数据格式后就应当及时更改此数值。
//sapmle
// CPosition类声明部分:
class CPosition : public CObject
{
DECLARE_SERIAL(CPosition)
CPosition();
int m_nCount;
CPoint m_ptPosition[100];
void Serialize(CArchive& ar);
CPoint GetValue(int index);
void SetValue(int index, CPoint point);
virtual ~CPosition();
};
// CPosition类实现部分:
IMPLEMENT_SERIAL(CPosition, CObject, 0)
CPosition::CPosition()
{
// 对类成员进行初始化
m_nCount = 0;
for (int i = 0; i < 100; i++)
m_ptPosition[i] = CPoint (0, 0);
}
CPosition::~CPosition()
{
}
void CPosition::SetValue(int index, CPoint point)
{
// 设置指定点的坐标值
m_ptPosition[index] = point;
}
CPoint CPosition::GetValue(int index)
{
// 获取指定点的坐标值
return m_ptPosition[index];
}
void CPosition::Serialize(CArchive &ar)
{
CObject::Serialize(ar);
if(ar.IsStoring())
{
// 存储持久性对象到档案
ar << m_nCount;
for (int i = 0; i < m_nCount; i++)
ar << m_ptPosition[i];
}
else
{
// 从档案装载持久性对象
ar >> m_nCount;
for (int i = 0; i < m_nCount; i++)
ar >> m_ptPosition[i];
}
}