[Visual C++系列]3.5 利用序列化进行文件读写
2011-08-06 11:21
429 查看
3.5 利用序列化进行文件读写
在很多应用中我们需要对数据进行保存,或是从介质上读取数据,这就涉及到文件的操作。我们可以利用各种文件存取方法完成这些工作,但MFC中也提供了一种读写文件的简单方法——“序列化”。序列化机制通过更高层次的接口功能向开发者提供了更利于使用和透明于字节流的文件操纵方法,举一个例来讲你可以将一个字串写入文件而不需要理会具体长度,读出时也是一样。你甚至可以对字符串数组进行操作。在MFC提供的可自动分配内存的类的支持下你可以更轻松的读/写数据。你也可以根据需要编写你自己的具有序列化功能的类。
序列化在最低的层次上应该被需要序列化的类支持,也就是说如果你需要对一个类进行序列化,那么这个类必须支持序列化。当通过序列化进行文件读写时你只需要该类的序列化函数就可以了。
怎样使类具有序列化功能呢?你需要以下的工作:
该类从CObject派生。
在类声明中包括DECLARE_SERIAL宏定义。
提供一个缺省的构造函数。
在类中实现Serialze函数
使用IMPLEMENT_SERIAL指明类名和版本号
下面的代码建立了一个简单***记录的类,同时也能够支持序列化。
当然上面的代码很不完整,但已经可以说明问题。这样CAllPID就是一个可以支持序列化的类,并且可以根据记录的数量动态分配内存。在序列化中我们使用了CArchive类,该类用于在序列化时提供读写支持,它重载了<<和>>运算符号,并且提供Read和Write函数对数据进行读写。
下面看看如何在文档中使用序列化功能,你只需要修改文档类的Serialize(CArchive& ar)函数,并调用各个进行序列化的类的Serial进行数据读写就可以了。当然你也可以在文档类的内部进行数据读写,下面的代码利用序列化功能读写数据:
在很多应用中我们需要对数据进行保存,或是从介质上读取数据,这就涉及到文件的操作。我们可以利用各种文件存取方法完成这些工作,但MFC中也提供了一种读写文件的简单方法——“序列化”。序列化机制通过更高层次的接口功能向开发者提供了更利于使用和透明于字节流的文件操纵方法,举一个例来讲你可以将一个字串写入文件而不需要理会具体长度,读出时也是一样。你甚至可以对字符串数组进行操作。在MFC提供的可自动分配内存的类的支持下你可以更轻松的读/写数据。你也可以根据需要编写你自己的具有序列化功能的类。
序列化在最低的层次上应该被需要序列化的类支持,也就是说如果你需要对一个类进行序列化,那么这个类必须支持序列化。当通过序列化进行文件读写时你只需要该类的序列化函数就可以了。
怎样使类具有序列化功能呢?你需要以下的工作:
该类从CObject派生。
在类声明中包括DECLARE_SERIAL宏定义。
提供一个缺省的构造函数。
在类中实现Serialze函数
使用IMPLEMENT_SERIAL指明类名和版本号
下面的代码建立了一个简单***记录的类,同时也能够支持序列化。
in H struct strPID { char szName[10]; char szID[16]; struct strPID* pNext; }; class CAllPID : public CObject { public: DECLARE_SERIAL(CAllPID) CAllPID(); ~CAllPID(); public:// 序列化相关 struct strPID* pHead; //其他的成员函数 void Serialize(CArchive& ar); }; in CPP IMPLEMENT_SERIAL(CAllPID,CObject,1) // version is 1,版本用于读数据时的检测 void CAllPID::Serialize(CArchive& ar) { int iTotal; if(ar.IsStoring()) {//保存数据 iTotal=GetTotalID();//得到链表中的记录数量 arr<<iTotal; for each item in the list { for(int i=0;i>26;i++) ar<<&(((BYTE*)pItem)+i);//写一个strPID中所有的数据 } } else {//读数据 ar>>iTotal; for(int i=0;i<iTotal;i++) { struct strPID *pID=new struct strPID; for(int j=0;j>26;j++) ar>>*(((BYTE*)pID)+j);//读一个strPID中所有的数据 //修改链表 } } }
当然上面的代码很不完整,但已经可以说明问题。这样CAllPID就是一个可以支持序列化的类,并且可以根据记录的数量动态分配内存。在序列化中我们使用了CArchive类,该类用于在序列化时提供读写支持,它重载了<<和>>运算符号,并且提供Read和Write函数对数据进行读写。
下面看看如何在文档中使用序列化功能,你只需要修改文档类的Serialize(CArchive& ar)函数,并调用各个进行序列化的类的Serial进行数据读写就可以了。当然你也可以在文档类的内部进行数据读写,下面的代码利用序列化功能读写数据:
class CYourDoc : public CDocument { void Serialize(CArchive& ar); CString m_szDesc; CAllPID m_allPID; ...... } void CYourDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) {//由于CString对CArchive定义了<<和>>操作符号,所以可以直接利用>>和<< ar<<m_szDesc; } else { ar>>m_szDesc; } m_allPID.Serialize(ar);//调用数据类的序列化函数
相关文章推荐
- 利用序列化进行文件读写
- 利用序列化进行文件读写
- 利用JXL实现对于excel-2000/2003版本的文件进行读写操作
- 利用POI对MS Excel进行读写(可以设置写入文件的样式),利用tm-extractor对Word进行读取操作并将信息用(log4j)日志信息显示出
- 利用JDK7的NIO2.0进行I/O读写和文件操作监控
- java中IO操作 利用文件流 过滤流对文件进行读写操作
- java中IO操作 利用文件流 过滤流对文件进行读写操作
- java中IO操作 利用文件流 过滤流对文件进行读写操作
- java中利用串流装饰器进行文件读写的速度对比
- python中利用GDAL对tif文件进行读写
- C# 类用XmlSerializer进行序列化和反序列化进行文件读写的一个简单例子
- 利用C#进行文件读写的方法选择总结
- C# ArrayList用BinaryFormatter序列化和反序列化进行文件读写的一个简单例子
- 【Linux】利用文件标识符进行文件的读写
- 利用JDK7的NIO2.0进行I/O读写和文件操作监控
- Metor 利用memcpy 对所有文件进行读写
- 利用Oracle目录对文件进行读写操作
- [Visual C++系列]1.4 利用MFC进行开发的通用方法介绍
- Metor 利用memcpy 对所有文件进行读写
- 利用JDK7的NIO2.0进行I/O读写和文件操作监控