http://www.vckbase.com/index.php/wv/1190.html
http://blog.csdn.net/wirror800/article/details/4003995
4 使用C++将对象进行序列化的几种方法
使用C++进行对象序列化的方法可以有以下三种:基于Boost库的方法;基于.Net Framework的方法;以及基于MFC的方法。本章将就三种方法的实现机制、实现步骤,以及注意事项进行说明。
由于我们的开发环境在Windows下,部署环境在Unix下,因此我们的开发需要使用两个平台都可以兼容的技术。经过验证,基于.Net和基于MFC的方法仅适用于Windows的环境,而Boost库在Windows和Unix下都有相应的版本,因此在项目中应优先考虑使用Boost库进行对象的序列化。尽管如此,本文中仍然列出使用.Net和MFC进行序列化的方法,以供参考。三种方法相应的代码实现的例子将附在文章之后。
MFC中的序列化:
实现步骤
实现序列化的的类需要满足一系列条件:
1. 该类需要从CObject类派生(可以是间接派生);
2. 在类中中进行DECLARE_SERIAL宏定义;
3. 类存在有缺省的构造函数;
4. 类中实现了Serialize(CArchive&)函数,并且在其中调用基类的序列化函数;
5. 使用IMPLEMENT_SERIAL宏指明类名及版本号。
满足了这些条件之后,就可以进行序列化与反序列化了。
序列化时,首先,实例化一个CArchive类的对象,将其与输出文件相关联;其次,利用CArchive类的<<运算符重载将需要序列化的对象保存在文件中。
反序列化时,将CArchive类的对象与保存对象的文件相关联;然后新建一个需要反序列化的对象,利用CArchive类的>>运算符重载将文件里的内容恢复到需要反序列化的对象中。
注意事项使用这种方法需要注意的是:
l 需要包含afx.h头文件;
l 它不支持string类型的序列化,但是支持CString类型的序列化;
l 需要将项目属性中的MFC属性配置为“在共享DLL中使用MFC”或“在静态库中使用MFC”,否则编译时会报错。
举例:
一、新建一个继承于 CObject 的子类 CLine;
头文件:Line.h
01.
class
CLine :
public
CObject
02.
{
03.
private
:
04.
LOGPEN m_logPen;
//画笔
05.
COLORREF
m_crBackColor;
06.
CArray<CPoint, CPoint &> m_PointArray;
//标记类对应框
07.
08.
public
:
09.
int
GetSize();
10.
CPoint GetPoint(
int
pos);
11.
void
DrawLine(CDC *pDC,CPoint pt1,CPoint pt2,CRect rc);
12.
void
DrawBackGround(CDC *pDC,CRect rect);
13.
void
DrawPoint(CDC *pDC, CRect rect);
14.
void
SetWidth(
int
iWidth);
15.
COLORREF
GetColor();
16.
void
SetColor(
COLORREF
color);
17.
18.
COLORREF
GetBkColor();
19.
void
SetBkColor(
COLORREF
color);
20.
21.
void
AddPoint(CPoint point);
22.
void
Clear();
23.
CLine();
24.
virtual
~CLine();
25.
virtual
void
Serialize(CArchive &ar);
26.
CLine& operator=(CLine &src);
27.
DECLARE_SERIAL(CLine);
28.
};
实现文件:Line.cpp
001.
//
002.
// Line.cpp: implementation of the CLine class.
003.
//
004.
//
005.
006.
#include "stdafx.h"
007.
#include "TestAdo.h"
008.
#include "Line.h"
009.
010.
#ifdef _DEBUG
011.
#undef THIS_FILE
012.
static
char
THIS_FILE[]=__FILE__;
013.
#define new DEBUG_NEW
014.
#endif
015.
016.
IMPLEMENT_SERIAL(CLine,CObject,1)
017.
018.
CLine::CLine()
019.
{
020.
Clear();
021.
}
022.
CLine::~CLine()
023.
{
024.
025.
}
026.
//重写 =
027.
CLine& CLine::operator=(CLine &src)
028.
{
029.
if
(
this
!=&src)
030.
{
031.
m_logPen = src.m_logPen;
032.
m_crBackColor = src.m_crBackColor;
033.
}
034.
return
*
this
;?
035.