在MFC中,CArchive对象可以将数据序列化(按照顺序)写入与它相关联的文件中去。它提供类型安全的缓冲机制。下面将讲解一下CArchive类常用的函数。

(1) 工作原理

CArchive类对象在初始化时,首先指定一个缓冲区作为临时存储,再将需要保存的数据写到缓冲区中。当缓冲区被填满时,才将缓冲区中的内容写入它所指向的CFile文件对象中。

同样,当用户读取数据时,串行化对象将数据从文件读取到指定的缓冲区,再从缓冲区读取到与对象相关联的文件中。这样,使用缓冲区不但减少了对物理硬盘的操作次数,而且提高了程序的运行速度。

(2) 串行化对象

在通常情况下,CArchive类使用构造函数创建指定的串行化对象,并且与CSocketFile对象相关联。其语法格式如下:
CArchive::CArchive(CFile *pfile, UINT nMode,
int nBufsize, void *lpBuf=NULL);

参数pfile指向一个需要进行串行化的对象指针。nMode是设置创建对象的标志。如果用户设置了此标志,则必须在对象销毁前调用Close()函数关闭文件。否则,文件中的数据将会被损坏。该参数的常用标志如表3-6所示。

表3-6  nMode的常用标志

常用标志 标志所表示的意义
CArchive::load(store) 从文件中读取(保存)数据
参数nBufsize用于设置的缓冲区大小;lpBuf用于自定义缓冲区,默认情况下为NULL。例如下面的代码:
CSocket *m_clientsocket = new CSocket;                   //创建套接字 
CSocketFile *m_sockfile =
new CSocketFile(&m_clientsocket); //创建与m_clientsocket关联的对象 
CArchive *m_archive =
new CArchive(&m_sockfile, CArchive::load|CArchive::store, 100, NULL);

在上述代码中,为创建的串行化对象m_archive设置一个大小为100的缓冲区。最后一个参数设为NULL,表明缓冲区由系统决定。

(3) 串行化操作

在CArchive类中,是使用函数ReadString()和WriteString()实现对CSocketFile文件的读写操作。函数的语法格式如下:
UINT CArchive::ReadString(CString str);  
void CArchive::WriteString(CString str1);

上述两个函数均包含一个字符串类型的参数。但是,其具体含义却不同,分别如下:

 str:表示将读取后保存的字符串数据。

 str1:表示将写入的字符串数据。

除了上面的方法以外,还可以使用串行化操作的基本方法。代码如下:
...                                 //省略部分代码 
m_archive<<str;                 //向串行化对象m_archive写入字符串str 
m_archive>>str1;                //从串行化对象m_archive读出数据到str1 
m_archive->Close();            //关闭串行化对象m_archive

在此需要注意,在关闭串行化对象后,与其相关联的文件对象也会随之被关闭。函数CArchive::Close()用于清除CArchive类创建时所指定的缓冲区,再关闭CArchive对象,并且将CArchive对象和与之相关联的CSocketFile对象进行分离。

如果用户需要马上将数据写入到串行化对象中,需要用到Flush函数。它主要用于将缓冲区中剩余的数据强制地写入CArchive对象所关联的文件中。例如下面的代码:
...                            //省略部分代码 
m_archive->WriteString(str + "\r\n"); //调用CArchive类的WriteString发送命令 
                                                //在此也可以使用m_archive<<str<<"\r\n"; 
m_archive->Flush();             //强制将数据str写入到串行化对象中 
m_archive->Close();             //关闭串行化对象

如果在程序中没有调用函数Flush(),那么真正将数据写入到物理磁盘是在调用函数Close()关闭串行化对象以后。为了防止丢失,需要使用Flush()函数将一些重要的数据立即写入文件。

使用CArchive类进行序列化相关推荐

  1. 类的序列化[Serializable]

    简介 序列化是指将对象实例的状态存储到存储媒体的过程.在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流.在随后对对象进行反序列化时,将创 ...

  2. Java : 实体类不能序列化异常

    Java : 实体类不能序列化异常 参考文章: (1)Java : 实体类不能序列化异常 (2)https://www.cnblogs.com/cccy0/p/9496435.html (3)http ...

  3. scala类的序列化_Scala序列理解,通用类和内部类示例

    scala类的序列化 A sequence comprehension statement consists of a generator part which generates a list of ...

  4. 关于类的序列化,下列说法哪些是正确的

    关于类的序列化,下列说法哪些是正确的:答案在文末 A. 类的序列化与serialVersionUID毫无关系. B. 如果完全不兼容升级,不需要修改serialVersionUID值. C. POJO ...

  5. python字典序列化是什么意思_python序列化中的字符串,列表,字典,类的序列化解释...

    python序列化中的字符串,列表,字典,类的序列化解释 yuaneuro • 2020 年 03 月 07 日 我们知道现在各大语言都有其序列化数据和反序列的方式, 比如php的serialize和 ...

  6. 【Hibernate】Hibrenate POJO 类在序列化时遇到的问题

    2019独角兽企业重金招聘Python工程师标准>>> 假设某 POJO 有属性如下: private Set<User> users = new HashSet< ...

  7. C#中使用JavaScriptSerializer类实现序列化与反序列化

    1.添加引用 JavaScriptSerializer类的使用需要引用System.Web.Extensions.dll文件,根据路径:C:\Program Files (x86)\Reference ...

  8. C#-利用Marshal类实现序列化

    主要是使用Marshal类里的两个方法: 第一个是StructureToPtr,将数据从托管对象封送到非托管内存块. 第二个是PtrToStructure,将数据从非托管内存块封送到新分配的指定类型的 ...

  9. JavaSE——IO(下)(Properties类、序列化与反序列化)

    第3节 IO(下) 一..properties文件与Properties类 1.1 .properties文件介绍 .properties文件一种属性文件,以键值对 的格式存储内容,在Java中可以使 ...

最新文章

  1. 剑指offer九:变态跳台阶
  2. 关于Metasploit开发环境的搭建
  3. python3 http.server 本地服务支持跨域
  4. 信息学奥赛一本通(1241:二分法求函数的零点)
  5. PolarDB-X 云原生分布式数据库 > 最佳实践 > 如何选择分片数
  6. 从Jensen不等式到Minkowski不等式
  7. JAVA 基础语法——开发环境以及J2SE代码实现
  8. 【J2EE】【1.HelloWorld】J2EE基础(jsp,servlet,tomcat,eclipse)
  9. excel如何设置保留两位小数
  10. java mail 匿名_匿名发送来自javamail的电子邮件
  11. 再见,2017,你好,2018
  12. Error starting ApplicationContext.
  13. 华科计算机系教学大纲,《批判性思维》课程教学大纲
  14. virt-install命令参数
  15. Postgresql skip locked跳过行锁消除行锁冲突等待
  16. ubuntu上mysql端口3306无法远程连接
  17. 【WCN685X】WCN685X WiFi 6E 6G信道与频宽对应关系
  18. POJ3238生日相同问题C++
  19. BenchmarkSQL配置参数介绍
  20. 【渝粤题库】广东开放大学 文化创意学 形成性考核 (2)

热门文章

  1. 微服务发现组件Eureka:微服务注册
  2. spring编程式事务控制
  3. 线性表及其逻辑和存储结构(二级)
  4. linux音频框架分析,Alsa音频子系统Codec---al5623.c内核代码框架分析
  5. 在 Markdown 中,如何在反引号对语句中使用反引号
  6. MySQL 免安装版的下载与配置教程
  7. linux 高性能服务排查方式
  8. Web server调研分析
  9. Anconda安装教程
  10. python-ConfigParser模块【读写配置文件】