VC++ MFC如何生成一个可串行化的类
一、MFC允许对象在程序运行的整个过程中持久化的串行化机制
(1)串行化是指向持久化存储媒介(如一个磁盘文件)读或写对象的过程。
(2)串行化用于在程序运行过程时或之后修复结构化数据(如C++类或结构)的状态。
(3)MFC支持CObject类中的串行化,所以,所有继承于CObject的类可以利用CObject的串行化协议。
(4)串行化的基本思想:
a、对象必须能将其当前状态写入到持久化存储媒介中,通常用其成员变量实现。
b、对象可以通过读或反序列化从存储媒介中重新构造对象的状态。
c、串行化处理所有对象指针的细节,以及序列化对象时对对象的循环引用。
d、关键点是对象自己负责读和写其本身的状态,所以,序列化一个对象时,必须是想基本的序列化操作。
(5)MFC使用CArchive类的对象作为被序列化的对象和存储媒介之间的中间媒介。
二、生成一个可串行化的类的步骤
(1) Derive your class from CObject. (定义一个基类为CObject的类)
(2) Override the Serialize member function.(重写串行化函数)
(3) Use the DECLARE_SERIAL macro in the class declaration.(在类声明文件中使用DECLARE_SERIAL宏)
(4) Define a constructor with no arguments (a default constructor).(定义一个无参数的构造函数)
(5) Use the IMPLEMENT_SERIAL macro in the class implementation file.(在实现文件中使用IMPLEMENT_SERIAL宏)
三、实例
Graph.h文件:
#pragma once // Graph 命令目标 class Graph : public CObject //(1)定义一个基类为COject的类
{
DECLARE_SERIAL(Graph) //(3)在类声明文件中使用DECLARE_SERIAL宏
public:
Graph(); //(4)定义一个无参数的构造函数
Graph(int drawType, CPoint ptOld);
virtual ~Graph(); void Serialize(CArchive &ar); //(2)重写串行化函数 private:
int m_drawType;
CPoint m_ptOld;
};
Graph.cpp文件:
// Graph.cpp : 实现文件
//
#include "stdafx.h"
#include "Archive.h"
#include "Graph.h"
// Graph
IMPLEMENT_SERIAL(Graph, CObject, 1) //(5)在实现文件中使用IMPLEMENT_SERIAL宏
Graph::Graph() //(4)定义一个无参数的构造函数
{
}
Graph::Graph(int drawType, CPoint ptOld)
{
this->m_drawType = drawType;
this->m_ptOld = ptOld;
}
Graph::~Graph()
{
}
// Graph 成员函数
void Graph::Serialize(CArchive &ar) //(2)重写串行化函数
{
if (ar.IsStoring())
{
ar<<m_drawType<<m_ptOld;
}
else
{
ar>>m_drawType>>m_ptOld;
}
}
如此之后,即可实现串行化类
VC++ MFC如何生成一个可串行化的类的更多相关文章
- MFC如何生成一个可串行化的类
一.MFC允许对象在程序运行的整个过程中持久化的串行化机制 (1)串行化是指向持久化存储媒介(如一个磁盘文件)读或写对象的过程. (2)串行化用于在程序运行过程时或之后修复结构化数据(如C++类或结构 ...
- MFC 文件I/O和串行化
1.枚举所有文件夹(递归) void EnumerateFolders () { WIN32_FIND_DATA fd; HANDLE hFind = ::FindFirstFile (_T (&qu ...
- MFC用串行化实现文档存储和读取功能
在面向对象的程序设计中,一般都是用二进制文件来保存文档资料.在VC++中控制和使用文件流的方法很多,MFC程序设计中常用的有两种方法:用CFile对象存储和读取文件:利用串行化存取文件.其中用CFil ...
- MFC文件IO和串行化
一. MFC中CFile对象实现了磁盘文档的读写,但是大部分MFC应用程序的IO服务都使用CArchive对象来完成.不管CFile和Archive输入输出的都是二进制数据,非文本数据. int a ...
- VC++ chap13 文档与串行化
Lesson 13 文档与串行化 13.1使用CArchive类对文件进行读写操作 //让对象数据持久性的过程称之为串行化,或者序列化 void CGraphicView::OnFileWrite() ...
- 【PHP面向对象(OOP)编程入门教程】22.把对象串行化serialize()方法,__sleep()方法,__wakeup()方法
有时候需要把一个对象在网络上传输,为了方便传输,可以把整个对象转化为二进制串,等到达另一端时,再还原为原来的对象,这个过程称之为串行化(也叫序列化), 就像我们现在想把一辆汽车通过轮船运到美国去,因为 ...
- PHP面向对象(OOP):把对象串行化serialize()方法,__sleep()方法,__wakeup()方法
有时候需要把一个对象在网络上传输,为了方便传输,可以把整个对象转化为二进制串,等到达另一端时,再还原为原来的对象,这个过程称之为串行化(也叫序列化), 就像我们现在想把一辆汽车通过轮船运到美国去,因为 ...
- JavaEE 对象的串行化(Serialization)
什么情况下需要序列化 a)当你想把的内存中的对象写入到硬盘的时候:b)当你想用套接字在网络上传送对象的时候:c)当你想通过RMI传输对象的时候:再稍微解释一下:a)比如说你的内存不够用了,那计算机就要 ...
- 关于ORACLE的串行化隔离级别--来自ORACLE概念手册
为了描述同时执行的多个事务如何实现数据一致性,数据库研究人员定义了被 称为串行化处理(serializability)的事务隔离模型(transaction isolation model).当所有 ...
随机推荐
- web端文字转语音的几种方案
最近在开发一个微信排队取号的的系统,其中对于服务员端(管理端) 需要有呼叫功能,即点按钮 就播出"xxx号顾客请就座"的声音. 经过在网上一番搜索研究,web端实现指定文字的语音播 ...
- 一、Html5基础讲解以及五个标签
什么是html?html是用来描述网页的一种语言html指超文本标记语言html不是编程语言,是一种标记语言 HTML基础标签 Head.body html标题 <h1>…<h6&g ...
- Python网络爬虫http和https协议
一.HTTP协议 1.官方概念: HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文 ...
- nginx 本地映射
server{ listen 80; server_name www.test.com; ssi on; ssi_silent_errors on; //设置为on则在处理SSI文件出错时不输出错误信 ...
- 微信小程序笔记<三>入口app.js —— 注册小程序
小程序开发框架在逻辑层使用的语言就是JavaScript,所以想玩小程序JavaScript的基本功一定要扎实.但小程序基于js做了一些修改,以方便开发者更方便的使用微信的一些功能,使得小程序更好的贴 ...
- leetCode 557. Reverse Words in a String I
Input: "Let's take LeetCode contest" Output: "s'teL ekat edoCteeL tsetnoc" 解:输入一 ...
- glibc -The GNU C Library
1.使用库文件 1.1.头文件 C库实际包含两部分:头文件,实际的库文件.头文件定义类型.定义宏.声明变量.声明函数.头文件定义的内容实际在库文件中实现.需要使用到 C库 的某些功能时,程序源文件包含 ...
- MySQL死锁问题分析及解决方法实例详解(转)
出处:http://www.jb51.net/article/51508.htm MySQL死锁问题是很多程序员在项目开发中常遇到的问题,现就MySQL死锁及解决方法详解如下: 1.MySQL常用 ...
- <项目管理的决策力>总结梳理
最近去总部参加了两天培训,关于<项目管理的决策力>,有时间会整理一下思路. ---todo 总结 6个阶段30个决策点如下:
- [Lua]table(二):删除与排序
function PrintTable(tb) for k,v in pairs(tb) do print(v) end print("-------------------") ...