必须为希望串行化的每个类覆盖Serialize。被覆盖的Serialize首先必须调用基类的Serialize函数。

在类的声明中必须使用DECLARE_SERIAL宏,并且在类的执行过程中也必须使用IMPLEMENT_SERIAL宏。

使用CArchive::IsLoading或CArchive::IsStoring函数,用于决定是否装载或存储了档案文件。

步骤是

1.必须在创建一个CArchive对象之前,创建一个CFile对象。

2.创建CArchive对象,要把它附加给表示一个打开文件的类CFile(或派生类)的对象上。(注意CArchive没有基类)

方法是:直接调用其构造函数进行关联。CArchive(CFile*pFile,UINTnMode,int nBufSize=4096,void*lpBuf=NULL );

3.使用一个串行化类通常有一个Serialize成员函数。并且使用DECLARE_SERIAL和IMPLEMENT_SERIAL。

//在在头文件使用DECLARE_SERIA(类名)在源文件使用  IMPLEMENT_SERIAL(类名,基类,版本)

Serialize 是一个虚函数,virtual void Serialize(CArchive&ar);   //自己重写该虚函数。

4.使用CArchive::IsLoading或CArchive::IsStoring函数,用于决定是否装载或存储了档案文件。

5.重载提取(>>)和插入(<<)是进行装载或存储操作。

archive 相当于文件,更近一步其实是文件之前的一个内存缓冲区。

DECLARE_SERIAL / IMPLEMENT_SERIAL 宏

DECLARE_SERIAL也包含了DECLARE_DYNCREATE,它用于创建对象.

在头文件使用DECLARE_SERIA(类名)
在源文件使用 IMPLEMENT_SERIAL( CMyClass, CObject, VERSIONABLE_SCHEMA | 2 )

//第一个参数是你的类名,第bai二个参数是基类名,第三个参数是个版本号,你可以随便写。

#define DECLARE_SERIAL(class_name) \
DECLARE_DYNCREATE(class_name) \
friend CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb);

#define IMPLEMENT_SERIAL(class_name, base_class_name, wSchema) \
CObject* PASCAL class_name::CreateObject() \
{ return new class_name; } \
_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, \
class_name::CreateObject) \
CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb) \
{ pOb = (class_name*) ar.ReadObject(RUNTIME_CLASS(class_name)); \
return ar; } \

即DECLARE_SERIAL重载了>>操作符,见上面。所以相当于从cobject派生的类具备了ReadObject的功能。

另外DECLARE_SERIAL只重载了>>操作符,没有重载了 << 操作符.因为writeobject不需要cruntimeclass.但readobject需要,因为读完文件后要动态创建操作。

另外CArchive类也定义>> 和 <<

friend CArchive& AFXAPI operator<<(CArchive& ar, const CObject* pOb)

friend CArchive& AFXAPI operator>>(CArchive& ar, CObject*& pOb);
    friend CArchive& AFXAPI operator>>(CArchive& ar, const CObject*& pOb);

这些重载运算符均定义在afx.inl文件中。

它大概有这么几个步骤:
1. 因为DECLARE_SERIAL重载了>>操作符,所以可以保证是调用CMessg类的>>函数.
2. >>函数实际上调用的是ar的ReadObject(CRuntimeClass*)函数
3. ReadObject首先从文件中读取类判断信息(可能是一个字符串,可能是一个类索引),得到Class对应的ClassName;
4. 程序的模块状态中有所有的RuntimeClass的列表,因此,查找对应的程序支持的RuntimeClass(对比ClassName),获得对应的RuntimeClass;
5. RuntimeClass中含有创建对象的方法CreateObject,调用它,创建对应的对象.这里,因为CreateObject实际就是 New 一个对象,类似 new CMessg; 所以,为了支持序列化,必须有没有参数的构造函数.
6. 创建对象之后,调用Seralize(ar),读入真正的对象的信息.
7. 将对象的指针返回.
8. pMessg就指向一个对应的对象了.

MFC 之序列化 serialize 和CArchive相关推荐

  1. php 传递类名,php 对象和数组序列化 serialize()返回字符串方便存储和传递 unserialize()反序列化 不丢失类型和结构...

    现在开发中经常使用序列号和反序列化技术手段,php开发中也大量使用到.如下几个知名系统都使用了大量的序列化技术ecshop 2. phpcms内容管理系统 3.laravel框架 一.序列号的目的? ...

  2. jquery序列化serialize()方法空格变为+问题解决参考方法

    jquery序列化serialize()方法空格变为+问题解决参考方法 参考文章: (1)jquery序列化serialize()方法空格变为+问题解决参考方法 (2)https://www.cnbl ...

  3. mysql序列化字段反序列化_序列化serialize()与反序列化unserialize()的实例

    在写序列化serialize与反序列化unserialize()时,我们先来看看: serialize - 产生一个可存储的值的表示 描述 string serialize ( mixed $valu ...

  4. 关于php序列化serialize字符串结构的说明

    许多php项目中运用序列化serialize字符串存取.解析变量,或者保存到数据库字段中,不是Json格式.XML格式,是一种特有的结构,如果不注意删除的部分字符,就会解析不正确,报错导致程序运行不正 ...

  5. 在线php序列化解析,PHP序列化serialize

    ## PHP序列化serialize ****序列化对象 - 在会话中存放对象 所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示.unserialize()函数 ...

  6. 表单序列化serialize()和serializeArray()的区别以及后台接收

    表单序列化serialize()和serializeArray()的区别以及后台接收 function add() {var data = $("#systemForm").ser ...

  7. 深入C#学习系列一:序列化(Serialize)、反序列化(Deserialize)

    序列化概述: 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象 ...

  8. form 表单序列化 serialize

    在开发中有时需要在js中提交form表单数据,就需要将form表单进行序列化. jquery提供的serialize方法能够实现. $("#searchForm").seriali ...

  9. select表单序列化serialize()出现问题

    今天在序列化select时,遇到了一个问题 HTML: <input name="id" type="text"/><select class ...

  10. php序列化(serialize)和反序列化(unserialize)函数

    用法:serialize().unserialize() 适用情境:serialize()返回字符串,此字符串包含了表示value的字节流,可以存储于任何地方.这有利于存储或传递 PHP 的值,同时不 ...

最新文章

  1. python程序从哪里开始执行-python如何启动
  2. c语言编程*字母图形,BIT网教c语言练习_编程复习1输出图形
  3. Spring注解开发-属性依赖注入
  4. C++ 面向对象(数据封装)
  5. 查看linux文件系统结构,如何查看Linux系统架构类型
  6. 午睡太久为什么浑身无力
  7. 蓝桥杯 ALGO-20 算法训练 求先序排列
  8. 观测天文角分辨率单位换算
  9. python程序语言二级教程_计算机二级python学习教程(2) python语言基本语法元素...
  10. java web导出excel_Web项目中数据导出Excel的实现方案
  11. PHP 发送谷歌邮箱
  12. 怎样卸载干净Oracle
  13. 数据清洗及OpenRefine工具
  14. VSCode更新失败无法打开,快捷方式无法正常工作
  15. 锦锐单片机开发工具_锦锐触摸MCU 单片机方案开发
  16. 服务器部署邮件功能_真正连续部署的功能标志
  17. 用循环首次适应算法、最佳适应算法和最坏适应算法,模拟可变分区存储管理,实现对内存区的分配和回收管理
  18. 《Python 黑帽子》学习笔记 - proxy - Day 10
  19. View和XenDesktop到底谁更简单 Part II
  20. 《巴菲特致股东的信(第4版)》笔记——每股增长

热门文章

  1. BZOJ 3192: [JLOI2013]删除物品 奇淫技巧树状数组
  2. hadoop安装和基本知识
  3. 关于call()的this指向研究
  4. mysql主主双机互备(三)
  5. django mysql 读写分离
  6. [转] Js获取 本周、本月、本季度、本年、上月、上周、上季度、去年时间段
  7. [翻译].NET委托:一个C#睡前故事 [转]
  8. Openlayers 杂项
  9. python爬取图片失败什么原因_请问下面这个python3.5下的爬虫程序有什么错误,为什么运行正常 但是不爬取图片?...
  10. idea添加scala环境_Scala(一)——scala+Idea环境配置