MFC的序列化技术(一)

6 篇文章 1 订阅
一、函数中运用序列化向本地文件存储和下载数据
序列化函数,将数据转换成二进制流,存储到本地文件:
void save()
{
CFile file("d:\\1.dat",CFile::modeCreate|CFile::modeWrite);
CArchive ar(&file,CArchive::store);
int i=12;
float f=3.1415;
ar<<i<<f;
ar.Close();
file.Close();
}
       首先,构造CFile对象file,其构造函数包含两个参数,第一个参数表示存储文件的路径,第二个个参数表示
打开的模式,是写入还是读取,如果没有该文件是不是需要先创建等等。
       然后构造CArchive类的对象ar,其构造函数第一个参数是刚才构造的CFile对象file的指针,第二个参数是打
的模式,是存储(序列化),还是下载(反序列化)。
       最后将变量i、f的值分别序列化到文件"d:\\1.dat"中,关闭ar和file。

反序列化函数,将本地文件的二进制数据流转换成对应的数据:
void load()
{
CFile file("d:/1.dat",CFile::modeRead);
CArchive ar(&file,CArchive::load);
int i;
float f;
ar>>i>>f;
printf("i=%d,f=%lf\n",i,f);
ar.Close();
file.Close();
}
       首先,还是构造CFile类的对象file,关联本地的存储文件"d:/1.dat",模式选择CFile::modeRead读取模式。
       然后,构造CArchive对象,绑定刚才构造的CFile类对象file,模式选择下载模式。
       最后声明两个变量i和f,利用CArchive对象ar将本地文件中的二进制数据流反序列化到这两个变量中,打印

这两个变量,并关闭ar和file。

源代码:
#include "stdafx.h"
#include "afxwin.h"
void save()
{
	CFile file("d:\\1.dat",CFile::modeCreate|CFile::modeWrite);
	CArchive ar(&file,CArchive::store);
	int i=12;
	float f=3.1415;
	ar<<i<<f;
	ar.Close();
	file.Close();
}

void load()
{
	CFile file("d:/1.dat",CFile::modeRead);
	CArchive ar(&file,CArchive::load);
	int i;
	float f;
	ar>>i>>f;
	printf("i=%d,f=%lf\n",i,f);
	ar.Close();
	file.Close();
}
int _tmain(int argc, _TCHAR* argv[])
{
	save();
	load();
	system("pause");
	return 0;
}

二、函数中运用序列化向内存中存储和下载数据

源代码如下:
#include "stdafx.h"
#include "afxwin.h"
void save(CMemFile* pFile)
{
	CArchive ar(pFile,CArchive::store);
	int i=10;
	float f=3.14;
	ar<<i<<f;
	ar.Close();
}

void load(CMemFile* pFile)
{
	CArchive ar(pFile,CArchive::load);
	int i;
	float f;
	pFile->Seek(CFile::begin,0);
	ar>>i>>f;
	printf("i=%d,f=%lf\n",i,f);
	ar.Close();
}
int _tmain(int argc, _TCHAR* argv[])
{
	BYTE* pBuf=new BYTE[1024];
	CMemFile File(pBuf,1024,0); 
	save(&File);
	load(&File);
	File.Close();
	delete[] pBuf;
	pBuf=NULL;
	system("pause");
	return 0;
}
      在main函数中,new了一块大小为1024个BYTE的内存,然后构造CMemFile对象File,该对象的构造函数有三个
参数,第一个为内存的指针;第二个参数为构造的CMemFile对象的大小,单位为字节;第三个参数,表示构造的
CMemFile对象大小不够时,内存增长的步长,即每次增加多少个字节。
      在save(CMemFile* pFile)函数中,参数为CMemFile对象的指针,其数据的序列化和存储到本地文件的形式类
似,先构造CArchive对象,然后直接序列化数据。
      在void load(CMemFile* pFile)中,要特别说明下,数据反序列化前,我们需要将此时的文件指针由末尾处移
到文件开头:pFile->Seek(CFile::begin,0);,然后才能进行数据的反序列化。
最后记得关闭文件File.Close();以及释放共享内存delete[] pBuf;



  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值