将对象保存至文件——CArchive
CArchive允许以一个二进制的形式保存一个对象的复杂网络,也可以再次装载它们,在内存中重新构造,这一过程叫作串行化/序列化(Serialization),简单的说,CArchive与CFile配合使用可以以二进制读取/保存数据到文件。
创建一个CArchive对象之前,你必须创建并成功打开一个CFile对象。另外,必须确信归档文件的装入(load)/存储(store)与文件的打开模式是兼容的,每一个文件只限于一个活动归档文件。
CArchive 对象的寿命只限于将对象写入文件或从文件读取对象的一次传递,也就是说,即使你使用了读写模式打开CFile对象,你也只能在load(store)结束并Close了CArchive对象后,才能重新对同一个CFile对象使用CArchive对象进行store(load)。
主要类型和CObject派生类都能支持CArchive进行读写,很多时候也需要重载CObject中的Serialize函数,蓝色部分为需要使用 << >> 时才需要做的步骤:
1. 继承CObject类
2. 重载CObject类的Serialize()成员函数
3. 在类的头文件中用Serialize的宏声明:DECLARE_SERIAL(CMyClass)
4. 定义默认(无参数)的构造函数
5. 在类文件中使用实现Serialize宏声明:IMPLEMENT_SERIAL(CMyClass, CObject, 1 /*版本号*/)
CArchive基本用法,其中 m_NetList 为一CListCtrl对象,在这里并没有重载Serialize:
存:
CString szFileName = _T("c:\\1.dat");
CFile file;
if (file.Open(szFileName, CFile::modeCreate | CFile::modeWrite)) {
CArchive ar(&file, CArchive::store);
int nCount;
nCount = m_NetList.GetItemCount();
ar << nCount;
for (int nID = 0; nID < nCount; nID++) {
ar << m_NetList.GetItemText(nID, 1);
ar << m_NetList.GetItemText(nID, 2);
ar << m_NetList.GetItemText(nID, 6);
}
ar.Close();
}
file.Close();
取:
CString szFileName = _T("c:\\1.dat");
CFile file;
if (file.Open(szFileName , CFile::modeRead)) {
CArchive ar(&file, CArchive::load);
int nCount, nID;
CString tempS;
m_NetList.DeleteAllItems();
ar >> nCount;
for (int i = 0; i < nCount; i++) {
nID = m_NetList.InsertItem(i, _T(""));
ar >> tempS;
m_NetList.SetItemText(nID, 1, tempS);
ar >> tempS;
m_NetList.SetItemText(nID, 2, tempS);
ar >> tempS;
m_NetList.SetItemText(nID, 6, tempS);
}
ar.Close();
}
}
file.Close();
将对象保存至文件——CArchive的更多相关文章
- Python强化训练笔记(七)——使用deque队列以及将对象保存为文件
collections模块中的deque对象是一个队列,它有着正常队列的先进先出原则.我们可以利用这个对象来实现数据的保存功能. 例如,现有一个猜数字大小的游戏,系统开始会随机roll点一个0-100 ...
- C# 将对象保存为文件 读取文件并转为对象 压缩文件 解压缩文件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- .Net之使用Jquery Ajax通过FormData对象异步提交图片文件到服务端保存并返回保存的图片路径
前言: 首先对于图片上传而言,在我们的项目开发中可以说出现的频率是相当的高的.这篇文章中,我将要描述的是在我们.Net中如何使用Jquery Ajax通过FormData对象异步提交图片文件到后台保存 ...
- C#对象与XMl文件之间的相互转换
C#提供三种序列化方式,分别为: 1.是使用BinaryFormatter进行串行化: 2.使用SoapFormatter进行串行化: 3.使用XmlSerializer进行串行化.其中对于Binar ...
- Java序列化 如何把多个对象存储在一个文件中
/** * 用于保存模板文件,内容包括: * 1,标志位,1 int * 2,版本 1 int * 3,数据头长度 1 int * 4,预留数据头空间 5120 byte * 5,后续数据长度 ...
- IT轮子系列(四)——使用Jquery+formdata对象 上传 文件
前言 在MVC 中文件的上传,一般都采用控件: <h2>IT轮子四——文件上传</h2> <div> <input type="file" ...
- Hibernate 对象关系映射文件
简介: POJO 类和关系型数据库之间的映射可以用一个 XML 文档来定义 通过 POJO 类的数据库映射文件,Hibernate 可以理解持久化类和数据表之间的对应关系,也可以理解持久化类属性与数据 ...
- C#对象与XMl文件之间的相互转换(转)
本文是对C#中对象与XMl文件之间的相互转换进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 C#提供三种序列化方式,分别为:1.是使用BinaryFormatter进行串行化: 2.使 ...
- C#.Net 持久化对象为XML文件
</pre><pre code_snippet_id="613717" snippet_file_name="blog_20150307_1_57950 ...
随机推荐
- bzoj2539
这道题真的不难,但是细节挺多(具体见程序)题目本身而言,显然是个费用流模型(或者写KM) type node=record point,next,flow,cost:longint; end; ..] ...
- bzoj1978
朴素的算法是O(n2logn)观察这个算法,似乎很难在进行优化我们就要换一种思路考虑到一个数的约数总不是很多,穷举约数也是可以在O(sqrt(x))的时间内完成的并且注意到,能否继续往下选数,只在于最 ...
- 【最短路】NEERC15 F Froggy Ford(2015-2016 ACM-ICPC)(Codeforces GYM 100851)
题目链接: http://codeforces.com/gym/100851 题目大意: 一只青蛙跳过宽为W的河,河中游N个石头,坐标xi,yi,现在往河中间添加一个石头,使得每次跳跃的最大的距离最小 ...
- FZYZOJ-1578 [NOIP福建夏令营]数列分段
P1578 -- [NOIP福建夏令营]数列分段 时间限制:1000MS 内存限制:131072KB 状态:Accepted 标签: 二分 无 无 Descripti ...
- 浅谈二维RMQ
针对一些二维区间最值问题,用一维RMQ来解决显然是不够的.所以,要改进算法.鉴于网上没有PASCAL版的RMQ标程与解析,所以小可在这里简单的讲一下. 核心思想和一维的一样,只是在计算区间时略有不同. ...
- 《University Calculus》-chape4-导数的应用-微分中值定理
罗尔定理:如果函数f(x)在[a,b]上连续并且在(a,b)处处可微,并且有f(a) = f(b),则我们必然何以找到一个c∈(a,b),使得f’(c) = 0. 证明:我们从函数f(x)的最大值和最 ...
- Spring 报错:Error creating bean with name
org.springframework.beans.factory.BeanCreationException: 原因是在autowire时,找不到相应的类,上述问题是因为XXXXX的实现类中没有加相 ...
- composer安装第三方库
生成composer.json 首先需要安装composer,composer -v出现如下,则表明安装成功. 编写composer.json { "name": "ww ...
- BDD框架之lettuce---python3.+安装报错
跟虫师学习python,学到BDD框架之lettuce( http://www.cnblogs.com/fnng/p/3415609.html),发现python3.5环境下安装lettuce后无法正 ...
- 如何评估oracle AWR 的在oracle 中的存储情况
如何评估oracle AWR 的在oracle 中的存储情况 如果把awr保存时间从默认的7天修改为30天,采样时间从1小时修改到更短,修改之后如何预估空间占用? ------------------ ...