[Visual C++系列]3.5 利用序列化进行文件读写
来源:互联网 发布:全职主妇 知乎 编辑:程序博客网 时间:2024/06/15 16:22
3.5 利用序列化进行文件读写
当然上面的代码很不完整,但已经可以说明问题。这样CAllPID就是一个可以支持序列化的类,并且可以根据记录的数量动态分配内存。在序列化中我们使用了CArchive类,该类用于在序列化时提供读写支持,它重载了<<和>>运算符号,并且提供Read和Write函数对数据进行读写。
在很多应用中我们需要对数据进行保存,或是从介质上读取数据,这就涉及到文件的操作。我们可以利用各种文件存取方法完成这些工作,但MFC中也提供了一种读写文件的简单方法——“序列化”。序列化机制通过更高层次的接口功能向开发者提供了更利于使用和透明于字节流的文件操纵方法,举一个例来讲你可以将一个字串写入文件而不需要理会具体长度,读出时也是一样。你甚至可以对字符串数组进行操作。在MFC提供的可自动分配内存的类的支持下你可以更轻松的读/写数据。你也可以根据需要编写你自己的具有序列化功能的类。
序列化在最低的层次上应该被需要序列化的类支持,也就是说如果你需要对一个类进行序列化,那么这个类必须支持序列化。当通过序列化进行文件读写时你只需要该类的序列化函数就可以了。
怎样使类具有序列化功能呢?你需要以下的工作:
- 该类从CObject派生。
- 在类声明中包括DECLARE_SERIAL宏定义。
- 提供一个缺省的构造函数。
- 在类中实现Serialze函数
- 使用IMPLEMENT_SERIAL指明类名和版本号
下面的代码建立了一个简单身份证记录的类,同时也能够支持序列化。
in Hstruct 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 CPPIMPLEMENT_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);//调用数据类的序列化函数
- [Visual C++系列]3.5 利用序列化进行文件读写
- 利用序列化进行文件读写
- 【Linux】利用文件标识符进行文件的读写
- C# 类用XmlSerializer进行序列化和反序列化进行文件读写的一个简单例子
- 利用标准C语言库函数进行文本文件读写
- 利用visual studio2017进行C语言环境的编程
- 利用Oracle目录对文件进行读写操作
- 利用xmlBean工具进行xml文件读写开发
- Metor 利用memcpy 对所有文件进行读写
- 利用C#进行文件读写的方法选择总结
- python中利用GDAL对tif文件进行读写
- Visual C++ 文件读写
- 利用Boost库进行序列化
- 【Java】 序列化(文件读写)
- scala文件操作--读写,序列化
- MFC的序列化操作文件读写
- C# ArrayList用BinaryFormatter序列化和反序列化进行文件读写的一个简单例子
- 串行化(序列化) 使用CArchive进行读写
- 我对建站的初步理解
- [Visual C++系列]Visual C++/MFC入门教程
- updatepanel FileUpload
- 开心一刻
- 2011-8-6 10:27:43
- [Visual C++系列]3.5 利用序列化进行文件读写
- 一次数据分析的全过程
- poj 2299树状数组求逆序数
- Rcp绝对路径和相对路径的获取
- C++内联函数解析
- RCP开发积累
- HDU3729 I'm Telling the Truth 匈牙利算法的二分图匹配
- DefaultLookAndFeel换皮肤
- maven相关