【原创】C++中对象的序列化
1、对象序列化
对象的序列化是指将对象的状态信息转换为可以存储或者传输的形式的过程。对象的反序列化是与序列化相反的过程。
在序列化期间,对象将其当前的状态写入到临时或者永久性的存储区,可以通过从存储区读取或者反序列化对象的状态,重新创建该对象。
通过序列化,可以将对象从一个应用域发送到另一个应用域中,或者通过网络连接将对象数据发送到另一台主机。
博文中将对象序列化到文件中。
2、C++下对象序列化的实现
1)将一个类的一个对象序列化到文件
这是最简单的情况,一个类中只定义一个数据成员。
//Srlz1.cpp: 将一个类的一个对象序列化到文件
#include <iostream>
#include <fcntl.h>
#include <vector>
#include <stdio.h>
using namespace std; //定义类CA
//数据成员:int x;
//成员函数:Serialize:进行序列化函数
// Deserialize反序列化函数
// Show:数据成员输出函数
class CA
{
private:
int x; //定义一个类的数据成员。 public:
CA() //默认构造函数
{
x = ;
}
CA(int y):x(y) //定义构造函数,用初始化列表初始化数据成员
{
}
virtual ~CA() //析构函数
{
}
public:
//序列化函数:Serialize
//成功,返回0,失败,返回0;
int Serialize(const char* pFilePath) const
{
int isSrlzed = -;
FILE* fp; //define a file pointer
//以读写方式打开文件,并判断是否打开;
if ((fp = fopen(pFilePath, "w+")) == NULL)
{
printf("file opened failure\n");
return -; //若打开失败,则返回-1;
}
//调用fwrite函数,将对象写入文件;
isSrlzed = fwrite(&x, sizeof(int), , fp); //判断写入是否成功;
if ((- == isSrlzed) || ( == isSrlzed))
{
printf("Serialize failure\n");
return -; //若写入失败,则返回-1;
}
if(fclose(fp) != ) //关闭文件
{
printf("Serialize file closed failure.\n");
return -;
}
printf("Serialize succeed.\n");
return ; //序列化成功,返回0;
} //反序列化函数:
//成功,返回0,失败,返回-1;
int Deserialize(const char* pFilePath)
{
int isDsrlzed = -;
FILE* fp;
//以读写方式打开文件,并判断是否打开;
if ((fp = fopen(pFilePath, "r+")) == NULL)
{
printf("file opened failure.\n");
return -;
}
//调用fread函数,读取文件中的对象 ;
isDsrlzed = fread(&x, sizeof(int), , fp);
//判断是否成功读入
if ((- == isDsrlzed)||( == isDsrlzed))
{
printf("Deserialize failure.\n");
return -; //若读取失败,则返回-1;
}
if(fclose(fp) != )
{
printf("Deserialize file closed failure.\n");
return -;
}
printf("Deserialize succeed.\n");
return ; //反序列化成功,则返回0;
} //成员对象输出显示函数
void Show()
{
cout<< "in Show():"<< x << endl;
}
};
以上代码定义了class CA,包括:
数据成员:x;
序列化函数:Serialize();
反序列化函数:Derialize();
数据成员输出函数:Show();
main函数:
int main(int argc, char const *argv[])
{
CA as(); //定义一个类对象,并初始化; //调用序列化函数,将对象as序列化到文件data.txt中;
as.Serialize("data.txt"); CA ad; //定义一个类对象,用来记录反序列化对象
//调用反序列化函数,将文件data.txt中的对象反序列化到ad对象;
ad.Deserialize("data.txt"); ad.Show(); //调用输出显示函数; return ; }
【原创】C++中对象的序列化的更多相关文章
- java中对象的序列化和反序列化
[对象的序列化和反序列化 ] 1.定义:序列化--将对象写到一个输出流中.反序列化则是从一个输入流中读取一个对象.类中的成员必须是可序列化的,而且要实现Serializable接口,这样的类的对象才能 ...
- 为什么需要用到序列化?为什么HttpSession中对象要序列化
简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保存Object States,但是Java给你提供一种应该比你自己好的保存对象状态的 ...
- asp.net中对象的序列化,方便网络传输
对象序列化 是将对象状态转换为可保持或传输的格式的过程.反序列化 是将流转换为对象序列化和反序列化相结合 可以使对象数据轻松的存储和传递 在 .NET 中,如果是对象可序列化,需要在 声明对象的开始部 ...
- 一文带你全面了解java对象的序列化和反序列化
摘要:这篇文章主要给大家介绍了关于java中对象的序列化与反序列化的相关内容,文中通过详细示例代码介绍,希望能对大家有所帮助. 本文分享自华为云社区<java中什么是序列化和反序列化?>, ...
- .net中对象序列化技术浅谈
.net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储 ...
- Android中SharedPreferences和序列化结合保存对象数据
前言: 最近在做用户注册的时候,遇到了需要填写很多表单数据,不可能在一页把所有的数据都展示完全,因此采用了分页的方式,由于在用户填写数据数据之后我们需要对用户填写的数据进行暂时的记录的,当用户会到此页 ...
- 线程安全使用(四) [.NET] 简单接入微信公众号开发:实现自动回复 [C#]C#中字符串的操作 自行实现比dotcore/dotnet更方便更高性能的对象二进制序列化 自已动手做高性能消息队列 自行实现高性能MVC WebAPI 面试题随笔 字符串反转
线程安全使用(四) 这是时隔多年第四篇,主要是因为身在东软受内网限制,好多文章就只好发到东软内部网站,懒的发到外面,现在一点点把在东软写的文章给转移出来. 这里主要讲解下CancellationT ...
- 第12讲-Java中的IO操作及对象的序列化与反序列化
1.知识点 1.1.课程回顾 1.2.本章重点 1.2.1 io操作 1.2.2 对象的序列化与反序列化 2.具体内容 2.1.Java IO 2.1.1.什么是IO IO其实就是输入.输出 I ...
- .net中对象序列化技术
序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数据.例如,可以序列化一个对象,然后使用 HTTP 通过 Inte ...
随机推荐
- Jade学习笔记
初学nodejs,折腾过用handlebars做模板,后来隔了一段重新学习,用了jade,真心简洁……记录一些学习笔记,以备复习. jade是基于缩进的,所以tab与space不能混用: 属性的设置: ...
- jquery节点查询
jQuery.parent(expr) //找父元素 jQuery.parents(expr) //找到所有祖先元素,不限于父元素 jQuery.children ...
- Go语言之异常处理
在编写Go语言代码的时候,我们应该习惯使用error类型值来表明非正常的状态.作为惯用法,在Go语言标准库代码包中的很多函数和方法也会以返回error类型值来表明错误状态及其详细信息. error是一 ...
- PHP学习系列(1)——字符串处理函数(1)
从09年开始使用JAVA到现在差不多5年多了,然后由于即将要去的公司(研究僧终于要毕业了!)是使用PHP,Python作为后台开发语言的,所以要开始一段双P的学习旅程.用过PHP的都说这是很简单的一门 ...
- Histogram Equalization
转载请注明出处. Histogram Equalization 也就是直方图均衡化, 是一种常用的通过直方图处理来增强图像的方法. 对于一副灰度图像,其像素范围一般在0~255之间,我们记nk(0&l ...
- 深入理解7816(3)-----关于T=0
卡片和终端之间的数据传输是通过命令响应的方式进行的,卡片只能被动地接收命令,并且给出响应.所有的命令都是以命令头开始,而该命令被完整地执行后(无论结果对错),必须以包含状态字(SW1 SW2)的响应结 ...
- hdu2460-Network:边的双连通分量
题目大意:给出一个无向图以及Q次询问,每次询问增加一条无向边,要求输出增加这条边后剩余的桥的数目. 算法:类似于求割点的方法,先做一次dfs求出所有的桥,并且维护这棵dfs树,当一次询问加入一条边(a ...
- OpenXML - 如何导出List<DataModel>到Excel -- Part 1
最近这几天研究OpenXML: 这是Open XML的一些介绍: Open XML 介绍:http://baike.baidu.com/view/1201978.htm 下载:http://www.m ...
- MySQL查询当前数据上一条和下一条的记录
如果ID是主键或者有索引,可以直接查找: 方法一: 查询上一条记录的SQL语句(如果有其他的查询条件记得加上other_conditions以免出现不必要的错误): ) [and other_cond ...
- maven java.lang.OutOfMemoryError:PermGEn space
配置环境变量: JAVA_OPTS-Xms512m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=512m MAVEN_OPTS-Xms256m -Xmx ...