c++序列化和反序列化简单demo

序列化和反序列化是指将数据结构或对象转换为一种可以存储或传输的格式(序列化),然后再将其恢复为原来的数据结构或对象(反序列化)。在C++中,通常使用标准库和一些辅助库来实现序列化和反序列化。下面是一个简单的示例,演示如何使用C++实现对象的序列化和反序列化。

我们将定义一个简单的Person类,并实现将其序列化为文件和从文件反序列化的功能。

#include <iostream>
#include <fstream>
#include <string>// 定义一个Person类
class Person {
public:std::string name;int age;// 构造函数Person() : name(""), age(0) {}Person(const std::string& name, int age) : name(name), age(age) {}// 序列化方法void serialize(const std::string& filename) {std::ofstream ofs(filename, std::ios::binary);if (!ofs) {throw std::runtime_error("Could not open file for writing");}// 写入字符串长度和字符串内容size_t name_length = name.size();ofs.write(reinterpret_cast<const char*>(&name_length), sizeof(name_length));ofs.write(name.c_str(), name_length);// 写入年龄ofs.write(reinterpret_cast<const char*>(&age), sizeof(age));ofs.close();}// 反序列化方法void deserialize(const std::string& filename) {std::ifstream ifs(filename, std::ios::binary);if (!ifs) {throw std::runtime_error("Could not open file for reading");}// 读取字符串长度和字符串内容size_t name_length;ifs.read(reinterpret_cast<char*>(&name_length), sizeof(name_length));name.resize(name_length);ifs.read(&name[0], name_length);// 读取年龄ifs.read(reinterpret_cast<char*>(&age), sizeof(age));ifs.close();}
};int main() {// 创建一个Person对象Person person1("Alice", 30);// 序列化到文件person1.serialize("person.dat");// 创建另一个Person对象用于反序列化Person person2;person2.deserialize("person.dat");// 打印反序列化后的对象std::cout << "Name: " << person2.name << ", Age: " << person2.age << std::endl;return 0;
}

说明

  1. Person类:包含两个成员变量nameage,以及序列化和反序列化的方法。
  2. 序列化方法:将对象的数据写入到一个二进制文件中。首先写入字符串的长度,然后写入字符串本身,最后写入整数。
  3. 反序列化方法:从一个二进制文件中读取数据并恢复对象。按照写入时的顺序读取字符串的长度,字符串本身和整数。
  4. main函数:创建一个Person对象并将其序列化到文件,然后再创建另一个Person对象并从文件中反序列化数据,最后打印结果。

这个示例展示了如何使用基本的文件操作和二进制数据读写来实现对象的序列化和反序列化。在实际应用中,可能会需要处理更多的数据类型和更复杂的对象结构,这时可以考虑使用更高级的库如Boost.Serialization。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/25733.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis条件构造bug

一、需求背景 &#xff08;本文源自微博客,且已获得授权&#xff09; 根据传递的参数&#xff0c;使用mybatis-plus动态构造查询语句。参数对象如下&#xff1a; private Integer id;private String ip;/*** 状态:0封锁;1:已解封*/private Integer status;/*** 开始时间*…

挑战绝对不可能:再证有长度不同的射线

黄小宁 一空间坐标系中有公共汽车A&#xff0c;A中各座位到司机处的距离h是随着座位的不同而不同的变数&#xff0c;例如5号座位到司机处的距离是h3&#xff0c;…h5&#xff0c;…。A移动了一段距离变为汽车B≌A&#xff0c;B中5号座位到司机处的距离h’h3&#xff0c;…h’h5…

2002NOIP普及组真题 3. 产生数

线上OJ 地址&#xff1a; 【02NOIP普及组】产生数 核心思想&#xff1a;组合数 dfs 高精度 1、如果一个数字有 3 位&#xff0c;每位有 2种可能性&#xff0c;则数字的 组合数 为 2*2*2 8 种 。故&#xff0c;只要求出每一位数字有多少种变体即可。 求 0 ~ 9 每一个数字的…

mysql 如何分布式部署

MySQL的分布式部署是一个涉及多个步骤和配置的过程&#xff0c;以确保数据库系统能够支持大规模数据存储、高并发访问和容错性。以下是MySQL分布式部署的主要步骤和要点&#xff0c;结合参考文章中的相关信息进行整理&#xff1a; 一、前期准备 环境准备&#xff1a; 选择合…

LLVM Cpu0 新后端 系列课程总结

想好好熟悉一下llvm开发一个新后端都要干什么&#xff0c;于是参考了老师的系列文章&#xff1a; LLVM 后端实践笔记 代码在这里&#xff08;还没来得及准备&#xff0c;先用网盘暂存一下&#xff09;&#xff1a; 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?…

AtCoder Beginner Contest 355

C - Bingo 2 题意 有一个 n n n\times n nn 的网格&#xff0c;初始全白&#xff0c;有 t t t 次操作&#xff0c;每次操作涂黑一个指定的格子。 问执行第几个操作后&#xff0c;有一行或一列或对角线的格子全部被涂黑。 思路 如果暴力判断&#xff0c;那么总时间复杂度…

一文搞懂线性回归模型

1、简单介绍 线性回归模型是一种基础的预测建模技术&#xff0c;用于分析一个或多个自变量&#xff08;特征&#xff09;与因变量&#xff08;目标&#xff09;之间的关系。它的基本假设是目标变量&#xff08;y&#xff09;与特征&#xff08;X&#xff09;之间存在线性关系。…

提升篇---接口和抽象类的本质区别

大家好&#xff0c;这里是教授.F 语法区别&#xff1a; 方法实现&#xff1a;接口中定义的方法默认都是抽象的&#xff0c;不包含方法的实现&#xff1b;而抽象类可以包含抽象方法和具体方法的实现。 多继承&#xff1a;一个类只能继承一个抽象类&#xff0c;但可以实现多个接…

测试与开发

目录 按照测试目标分类 界面测试 功能测试 性能测试 可靠性测试 安全性测试 易用性测试 按照执行方式分类&#xff1a; 测试方法 白盒测试 语句覆盖 条件覆盖 判定条件覆盖 条件组合覆盖 路径覆盖 黑盒测试 灰盒测试 按照测试阶段分类 单元测试 集成测试 …

【iOS】界面推出的方法

【iOS】界面推出的方法 在学习过程中我们发现在iOS中有两种界面推出的方法&#xff1a;push 和 present这两种方法都可以用来推出一个新的界面 但是这两者是存在区别的 push 方法是通过 UINavigationController 进行导航,新的视图控制器会被压入导航栈中&#xff0c;可以跨级…

写给大数据开发,如何去掌握数据分析

这篇文章源于自己一个大数据开发&#xff0c;天天要做分析的事情&#xff0c;发现数据分析实在高大上很多&#xff0c;写代码和做汇报可真比不了。。。。 文章目录 1. 引言2. 数据分析的重要性2.1 技能对比2.2 业务理解的差距 3. 提升数据分析能力的方向4. 数据分析的系统过程4…

前端 JS 经典:Promise 详解

1. Promise 由来 在以前我们实现异步是用的回调函数&#xff0c;当一个异步请求需要依赖上一个异步请求返回的结果的时候&#xff0c;就会形成如下这种的调用结构。 请求1(function (结果1) {请求2(function (结果2) {请求3(function(结果3)) {请求4(function(结果4) {})}});…

Windows下载安装RabbitMQ客户端(2024最新篇)

文章目录 RabbitMQ认知RabbitMQ下载RabbitMQ安装 更多相关内容可查看 RabbitMQ认知 定义&#xff1a;RabbitMQ是一个消息中间件&#xff0c;它接受并转发消息。你可以把它当做一个快递站点&#xff0c;当你要发送一个包裹时&#xff0c;你把你的包裹放到快递站&#xff0c;快递…

2024年土建施工员考试题库及答案

一、单选题 1.某工程项目桩基工程采用套管成孔灌注桩&#xff0c;为了保证施工质量&#xff0c;桩管灌满混凝土后开始拔管&#xff0c;按照规定&#xff0c;管内应保持不少于&#xff08;&#xff09;m高的混凝土。 A.1 B.1.5 C.2 D.2.5 答案&#xff1a;C 解析&…

免费!GPT-4o发布,实时语音视频丝滑交互

We’re announcing GPT-4o, our new flagship model that can reason across audio, vision, and text in real time. 5月14日凌晨&#xff0c;OpenAI召开了春季发布会&#xff0c;发布会上公布了新一代旗舰型生成式人工智能大模型【GPT-4o】&#xff0c;并表示该模型对所有免费…

JDBC简介以及快速入门

这些都是JDBC提供的API 简介 每一个数据库的底层细节都不一样 不可能用一套代码操作所有数据库 我们通过JDBC可以操作所有的数据库 JDBC是一套接口 我们自己定义了实现类 定义实现类 然后就能用Java操作自己的数据库了 MySQL对于JDBC的实现类 就是驱动 快速入门 创建新的项…

MySQL-函数/约束

MySQL-函数 distinct-去重 //放在select后 1、字符串函数 SELECT 函数(参数) CONCAT(S1,S2,S3...)-字符串拼接&#xff0c;拼接成一个字符串。 LOWER(str)-将字符串str全部转换为小写。 UPPER(str)-将字符串str全部转换为大写。 LPAD(str,n,pad)-左填充&#xff0c;用字…

vscode copilot git commit 生成效果太差,用其他模型替换

问题 众所周知&#xff0c;copilot git commit 就像在随机生成 git commit 这种较为复杂的内容还是交给大模型做比较合适 方法 刚好&#xff0c;gitlens 最近开发了 AI commit的功能&#xff0c;其提供配置url api可以实现自定义模型 gitlens 只有3种模型可用&#xff1a…

【Python】在【数据挖掘】与【机器学习】中的应用:从基础到【AI大模型】

目录 &#x1f497;一、Python在数据挖掘中的应用&#x1f495; &#x1f496;1.1 数据预处理&#x1f49e; &#x1f496;1.2 特征工程&#x1f495; &#x1f497;二、Python在机器学习中的应用&#x1f495; &#x1f496;2.1 监督学习&#x1f49e; &#x1f496;2.2…

树二叉树

树 ​ 树是 n&#xff08;n≥0&#xff09;个结点的有限集。当 n 0时&#xff0c;称为空树。在任意一颗非空树中应满足&#xff1a; &#xff08;1&#xff09;有且仅有一个特定的称为根的结点。 &#xff08;2&#xff09;当 n > 1时&#xff0c;其余结点可分为 m&…