以下示例显示了如何通过存档将对象存储在文件中: // todo: add loading code here carchive ar(&thefile, carchive::store); word wemployeeid; ...
ar << wemployeeid;
void cperson:serialize(carchive& ar)
从先前存储在文件中的值加载对象
{
以下示例显示了如何从先前存储在文件中的值加载对象:
if (ar.isstoring())
carchive ar(&thefile, carchive::load);
{
word wemployeeid;
ar << m_strname;
...
ar << m_wage;
ar >> wemployeeid;
} } }
上面的代码模板与 appwizard 为该文档(从 cdocument 派生的类)的 s总是并行,该代码模板有助于写的代码更容易复查,如下例中所示:
通常,通过 cobject 派生类的 serialize 函数中的存档将数据存储到文件中或从文件中加载数据,必须已用 declare_serializ件中加载数据或将数据存储到文件中。
{
可序列化的 cobject 派生类的 serialize 函数通常具有以下形式:
ar >> m_strname;
void cperson::serialize(carchive& ar)
ar >> m_wage;
{
}
cobject::serialize(ar);
}
if (ar.isstoring()) {
cobject*
// todo: add storing code here } else {
size 和 csize float word cstring
point 和 cpoint dword
些函数。将 carchive 对象的引用传递到 serialize 函数。调用 else carchive 对象的 isloading 函数以确定是否已调用 serializ
库将 carchive 的“ << ”和“ >> ”运算符定义为第一操作数,将下列
byte
rect 和 crect double long
ctime 和 ctimespan int
colecurrency colevariant
coledatetime coledatetimespan
l 在 view 类中添加对控件的响应,实现画图功能,每次鼠标弹l 保存文件(通过 doc 的 serialize 来保存数据)
l 打开文件(通过 doc 的 serialize 来读取数据,并将其重绘在 view 类中定义 cobarray m_obarray;
下面按这个思路来完成:(在 c graph 子类中完成重绘的画图功能) graph.cpp
#include \#include \
implement_serial(cgraph, cobject, 1 )
cgraph::cgraph(void)
注意 通过存档存储及加载 cobjects 需要额外注意。有关更多信息,请参见通过存档存储和加载 cobjects 。
: m_ptorigin(0)
carchive 的“ << ”和“ >> ”运算符总是返回 carchive 对象的引用,该引用为第一操作数。这使您可以链接运算符,如下所
, m_ptend(0)
byte bsomebyte;
, m_ndrawtype(0)
word wsomeword;
{
dword wsomedoubleword;
}
...
cgraph::cgraph(cpoint m_ptorigin,cpoint m_ptend,uint m_ndrawtype
ar << bsomebyte << wsomeword << wsomedoubleword;
{
this->m_ptorigin=m_ptorigin;
this->m_ptend=m_ptend;
通过存档存储及加载 cobject (见前)
this->m_ndrawtype=m_ndrawtype;
下面用一个示例来解释这个问题。
}
目标:一个画图程序,通过保存打开按钮存取图片。方法:保存图片绘制信息。
cgraph::~cgraph(void)
按步骤:
{
l 创建可序列化的类 ->graph.cpp+graph.h
}
void cgraph::serialize( carchive& ar ) {
// 继承基类的cobject cobject::serialize( ar ); if( ar.isstoring() ) {
case 2:
pdc->moveto(m_ptorigin); pdc->lineto(m_ptend); break; case 3:
pdc->rectangle(crect(m_ptorigin,m_ptend)); break;
ar << m_ptorigin << m_ptend << m_ndrawtype ; case 4: } else {
pdc->ellipse(crect(m_ptorigin,m_ptend)); break; }
ar >> m_ptorigin >> m_ptend >> m_ndrawtype ; pdc->selectobject(poldbrush); } }
void cgraph::draw(cdc* pdc) {
} graph..h #pragma once
#include \
cbrush *pbrush=cbrush::fromhandle((hbrush)getstockobject(null_brush)); cbrush *poldbrush=pdc->selectobject(pbrush); class cgraph : publiccobject switch(m_ndrawtype) { case 1:
pdc->setpixel(m_ptend,rgb(0,0,0)); break;
{ public :
declare_serial( cgraph ) cgraph(void);
cgraph::cgraph(cpoint m_ptorigin,cpoint m_ptend,uint m_ndra
void serialize( carchive& ar ); ~cgraph(void); cpoint m_ptorigin; cpoint m_ptend; uint m_ndrawtype; void draw(cdc* pdc); };
在 view 类中添加画图功能 void cgraphicserialview::ondot() {
// todo: 在此添加命令处理程序代码 m_ndrawtype=1; }
void cgraphicserialview::online() {
// todo: 在此添加命令处理程序代码 m_ndrawtype=2; }
void cgraphicserialview::onrectangle() {
// todo: 在此添加命令处理程序代码
m_ndrawtype=3; }
void cgraphicserialview::onellipse() {
// todo: 在此添加命令处理程序代码 m_ndrawtype=4; }
void cgraphicserialview::onlbuttondown(uint nflags, cpoint point{
// todo: 在此添加消息处理程序代码和/或调用默认值 m_ptorigin = point;
cview::onlbuttondown(nflags, point); }
void cgraphicserialview::onlbuttonup(uint nflags, cpoint point) {
// todo: 在此添加消息处理程序代码和/或调用默认值 cclientdc dc(this);
cbrush *pbrush=cbrush::fromhandle((hbrush)getstockobject(nu dc.selectobject(pbrush);
switch(m_ndrawtype) { case 1:
dc.setpixel(point,rgb(0,0,0)); break; case 2:
dc.moveto(m_ptorigin);
但是要保存和读取文件需要用到 serialize 因此转到 doc 类
void cgraphicserialdoc::serialize(carchive& ar) {
position pos=getfirstviewposition();// 获得第一个视类对象在
cgraphicserialview *pview=(cgraphicserialview*)getnextview(p类对象
if (ar.isstoring())
dc.lineto(point);
{
break;
// todo: 在此添加存储代码
case 3:
int ncount=pview->m_obarray.getsize();
dc.rectangle(m_ptorigin.x,m_ptorigin.y,point.x,point.y); break;
for(int i=0;i case 4: { dc.ellipse(crect(m_ptorigin,point)); ar< break; } default: } break; else } { // 将图形信息保存起来 // todo: 在此添加加载代码 int ncount; m_obarray.add(pgraph);// 将一群这样的pgraph组织在一起放进m_obarray ar>>ncount; cview::onlbuttonup(nflags, point); cgraph *pgraph; } ar< cgraph *pgraph=new cgraph( m_ptorigin , point , m_ndrawtype ); // 创建一个pgraph指针指向一个存储图形信息的