C++使用boost::serialization进行序列化

news2024/11/26 13:44:39

废话

发现一个比较好玩的东西,boost::serialization序列化操作,简单来说感觉像ofstream和ifstream的升级版,Boost.Serialization 库能够将c++项目中的对象转换为一序列的比特(bytes),用来保存和加载还原对象。

在ORBSLAM3保存和加载地图的时候好像就是采用的这种方法,后面需要再深入研究一下。

实战

参考链接:https://www.jianshu.com/p/c2f830cee98c
感觉这个大佬写的很不错,参考了一下他的分享自己写了一个简单的小例子,设计了一个简单的相机信息类CameraInfo。然后对其进行序列化和反序列化操作,也就是对象的写入和加载。

代码文件:

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <boost/archive/binary_iarchive.hpp> //二进制序列化
#include <boost/archive/binary_oarchive.hpp> //二进制序列化
#include <boost/serialization/vector.hpp> //序列化STL容器要导入
#include <boost/serialization/string.hpp>

using namespace std;

class CameraInfo{
public:
    CameraInfo(){};
    CameraInfo(const int _fx, const int _fy, const int _cx, const int _cy, const vector<float> &_vDistortion, string &_CamName);
    ~CameraInfo(){}

    int getFx(){return fx;}
    int getFy(){return fy;}
    int getCx(){return cx;}
    int getCy(){return cy;}
    vector<float> getDistortion(){return mvDistortion;}
    string getCamName(){return CamName;}
private:
    friend class boost::serialization::access;
    template <typename Archive>
    void serialize(Archive &ar, const unsigned int version)
    {
        ar &fx;
        ar &fy;
        ar &cx;
        ar &cy;
        ar &mvDistortion;
        ar &CamName;
    }

    int fx,fy,cx,cy;
    vector<float> mvDistortion;
    string CamName;
};

CameraInfo::CameraInfo(const int _fx, const int _fy, const int _cx, const int _cy, const vector<float> &_vDistortion, string &_CamName)
:fx(_fx),fy(_fy),cx(_cx),cy(_cy),mvDistortion(_vDistortion),CamName(_CamName)
{}

void SaveFileTest()
{
    // 文本写入测试
    vector<float> dist = {0.001, -0.03, 0.0004, 0.004};
    string camName = "realsense";
    CameraInfo cam(222,222,230,230,dist,camName);
    ofstream fout("testfile", ios::binary);
    if(fout.is_open())
    {
        boost::archive::binary_oarchive oa(fout);
        oa << cam;
        fout.close();
    }
    else{
        cout<<"open file failed."<<endl;
        exit(-1);
    }
}

void LoadFileTest()
{
    // 文本读取测试
    CameraInfo cam2;
    ifstream fin("testfile",ios::in|ios::binary);
    fin.seekg(0, ios::end);
    streampos fp = fin.tellg();
    if(fin.is_open() && fp)
    {
        fin.seekg(0);
        boost::archive::binary_iarchive ia(fin);
        ia >> cam2;

        printf("fx = %d, fy=%d, cx=%d, cy=%d\r\n",cam2.getFx(),cam2.getFy(),cam2.getCx(),cam2.getCy());
        vector<float> distortion = cam2.getDistortion();
        printf("Distortion = [%f, %f, %f, %f]\r\n",distortion[0],distortion[1],distortion[2],distortion[3]);
        printf("CamName = %s\r\n",cam2.getCamName().c_str());
    }
    else{
		cout<<"open file failed."<<endl;
        exit(-1);
	}
}

int main(int argc, char** argv)
{
    // 文本写入测试
    SaveFileTest();
    // 文本读取测试
    LoadFileTest();
    return 0;
}

CMakeLists.txt文件

cmake_minimum_required(VERSION 3.10)

project(testSerialize)

set(CMAKE_BUILD_TYPE "Release")

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall   -O3")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall   -O3")
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -march=native")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -march=native")

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR})
add_executable(testSerialize testSerialize.cpp)
target_link_libraries(testSerialize -lboost_serialization)

输出结果:
在这里插入图片描述

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

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

相关文章

PPT里的逆天功能之-PPT扣图(可以秒杀PS的扣图功能)

PPT的扣图功能秒杀PS PPT其实非常强大,它里面有数不甚数的功能是我们之前从未使用过的。比如说PPT的扣图功能。比如说我们有一个背景是灰黑的。 而我们网上可以下到的一些logo很多是带有底色的,它会和我们的背景形成很大的反差。此时我们往往就会用PS工具。这就会让大都IT们…

leetcode数据库题第四弹

leetcode数据库题第四弹 619. 只出现一次的最大数字620. 有趣的电影626. 换座位627. 变更性别1045. 买下所有产品的客户1050. 合作过至少三次的演员和导演1068. 产品销售分析 I1070. 产品销售分析 III1075. 项目员工 I1084. 销售分析III小结 619. 只出现一次的最大数字 https:/…

MySQL的JDBC编程详解

1.JDBC编程概念 在实际项目中&#xff0c;我们对于数据库的操作大部分是通过代码来完成的&#xff0c;各种数据库在开发的时候&#xff0c;都会提供一组编程接口API。所以不同公司使用不同的数据库软件&#xff0c;那么程序员学习成本是非常大的&#xff0c;因为要学习不同数据…

超好用的5款软件,每一款都让你爱不释手

分享爱&#xff0c;分享时光&#xff0c;分享精彩瞬间&#xff0c;大家好&#xff0c;我是互联网的搬运工&#xff0c;今天继续给大家带来几款好用的软件。 1.GIF录制——LICEcap ​ LICEcap是一款用于录制屏幕为GIF动画的工具。它可以让你用一个可调整的窗口来捕捉你的屏幕上…

2023年前端面试高频考点HTML5+CSS3

目录 浏览器的渲染过程⭐⭐⭐ CSS 、JS 阻塞 DOM 解析和渲染 回流&#xff08;重排&#xff09;和重绘⭐⭐ 选择器 ID选择器、类选择器、标签选择器&#xff08;按优先级高到低排序&#xff09;⭐⭐ 特殊符号选择器&#xff08;&#xff1e;,,~&#xff0c;空格&#xff0…

【JavaEE】网络编程之TCP套接字

目录 1、TCP套接字 1.1、ServerSocket 常用API 1.2、Socket 常用API 2、基于TCP套接字实现一个TCP回显服务器 2.1、服务器端代码 2.2、客户端代码 2.3、解决服务器不能同时和多个客户端建立链接的问题 3、基于TCP socket 写一个简单的单词翻译服务器 1、TCP套接字 T…

【中文编程】青语言

【引言】 青语言主页&#xff1a;https://qingyuyan.cn 青语言文档&#xff1a;https://doc.qingyuyan.cn 青语言社区&#xff1a;https://forum.qingyuyan.cn 青语言仓库&#xff1a;https://gitee.com/NjinN/Qing 长久以来&#xff0c;中文编程一直是开发者社区中争议不断的…

opencv读写png

[1] 测试了怎么手动加 alpha 通道设置透明度后&#xff0c;用 PIL.Image 存 png&#xff0c;通道顺序是 RGBA。这里测试用 opencv 读、写 3、4 通道的 png。 png 可以只存 3 通道的&#xff0c;即不要 alpha&#xff0c;也可以加上 alpha。而无 alpha 时 opencv 的通道顺序是 …

微信视频号加强打击肖像授权侵权短视频

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 视频号安全中心发布公告称&#xff1a;视频号将打击肖像权和侵权的短视频&#xff0c;并在7月份上线“视频授权功能”。 5月份视频号已经下架了3万多条视频&#xff0c;1万多个帐号减少推荐。你看3…

Spring框架-面试题核心概念

目录 1.Spring框架的作用是什么&#xff1f; 2. 什么是DI&#xff1f; 3.什么是AOP&#xff1f; 4.Spring常用注解 5.Spring中的设计模式 6.Spring支持的几种bean的作用域 7.Spring中Bean的生命周期&#xff1f; 8.Spring中的事务管理 9.Spring中的依赖注入方式有几种 10.Sprin…

SpringBoot项目热部署设置

目录 1.设置热部署的好处 2.设置热部署的坏处 3.设置热部署的流程 4.关闭热部署功能 1.设置热部署的好处 Spring Boot 热部署的主要好处是在开发过程中提高了开发效率和体验。它让开发者在修改代码后无需手动重启应用程序&#xff0c;而是可以快速自动重新加载应用程序&…

【新版】系统架构设计师 - 信息安全技术基础知识

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 信息安全技术基础知识考点摘要信息安全基础知识信息安全系统的组成框架信息加密技术对称加密&#xff08;共享密钥&#xff09;非对称加密&#xff08;公开密钥&#xff09;信息摘要数字签名数字信…

el-upload 多文件依次上传(防抖 + 递归)

需求描述 多图上传组件&#xff0c;1-9 张图选择完文件后自动上传&#xff0c;不需要上传按钮来进行手动上传 难点 接口有两种&#xff0c;多图集合上传接口 uploadImgs、单图上传接口 uploadImg 使用 uploadImgs 接口&#xff0c;参数为图片集合 fileList&#xff0c;但是缺…

Spring架构篇--2.7.4 远程通信基础--Netty原理--bind实现客户端acceptread事件处理

前言&#xff1a;本文在Netty 服务端已经实现NioServerSocketChannel 管道的初始化并且绑定了端口后&#xff0c;继续对客户端accept&read事件如何处理进行探究&#xff1b; 1 对客户端accept&read事件的触发&#xff1a; 从之前的ServerBootstrap 的bind 方法中似乎…

JMeter接口测试新思路——灵活使用BeanShell

目录 前言&#xff1a; BeanShell的简介 调用Java方法 执行Class文件 结合实际案例 总结 前言&#xff1a; 在JMeter进行接口测试时&#xff0c;我们可能会遇到需要调用Java方法或者执行Java代码的情况&#xff0c;这时候我们可以使用BeanShell来实现。BeanShell是一个类…

QuintoAndar 如何提高转化率

QuintoAndar 如何提高转化率 ——求关注、求点赞、求分享&#xff0c;二毛拜谢。 QuintoAndar 如何通过提高页面性能来提高每次会话的转化率和页面数 一个专注于优化 Core Web Vitals 并迁移到 Next.js 的项目使转换率提高了 5%&#xff0c;每个会话的页面增加了 87%。 Quint…

07.JavaWeb-Vue+elementUI

1.Vue 功能替代JavaScript和jQuery&#xff0c;基于JavaScript实现的前端框架 1.1配置Vue 1.1.1引入vue库 方法一&#xff1a;通过cdn链接引入最新版本的vue&#xff08;可能会慢些&#xff09; <head><script src"https://cdn.jsdelivr.net/npm/vue">…

基于yolov5开发构建道路路面病害检测识别系统——以捷克、印度、日本三国城市道路实况场景数据为例,开发对比分析模型并分析对应性能

城市道路病害检测是最近比较热门的一个任务领域&#xff0c;核心就是迁移深度学习目前已有的研究成果来实现实时城市道路路面病害的检测识别分析&#xff0c;在我之前的很多博文中都有做过类似桥梁、大坝、基建、隧道等水泥设施裂缝裂痕等目标检测相关的项目&#xff0c;除此之…

利用powershell脚本进行内网渗透

powershell知识点 ps1是powershell脚本的拓展名&#xff0c;就相当于cmd的.bat脚本&#xff0c;但是他更加强大。 获取版本信息 get-host #查看powershell的版本信息$psversiontable #查看powershell的版本信息执行策略 PowerShell 执行策略是一项安全功能&#xff0c;用于控…

softmax之温度系数

1.数学表示 这是传统的softmax&#xff1a; q i e x p ( z i ) ∑ j e x p ( z j ) q_i \frac{exp(z_i)}{\sum_jexp(z_j)} qi​∑j​exp(zj​)exp(zi​)​ 或者写&#xff1a; q i e x p ( z i ) / 1.0 ∑ j e x p ( z j / 1.0 ) q_i \frac{exp(z_i)/1.0}{\sum_jexp(z_j/…