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

这篇具有很好参考价值的文章主要介绍了C++使用boost::serialization进行序列化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

废话

发现一个比较好玩的东西,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)

输出结果:
C++使用boost::serialization进行序列化文章来源地址https://www.toymoban.com/news/detail-477077.html

到了这里,关于C++使用boost::serialization进行序列化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Django REST framework中的序列化Serializers

    序列化器允许将诸如查询集和模型实例之类的复杂数据转换为原生 Python 数据类型,然后可以将它们轻松地呈现为 JSON,XML 或其他内容类型。序列化器还提供反序列化,在首次验证传入数据之后,可以将解析的数据转换回复杂类型。 简单来说,服务器通过api 返回数据(json格

    2024年02月09日
    浏览(33)
  • Flask SQLAlchemy_Serializer ORM模型序列化

    在前后端分离项目中,经常需要把ORM模型转化为字典,再将字典转化为JSON格式的字符串。在遇到sqlalchemy_serializer之前,我都是通过类似Java中的反射原理,获取当前ORM模型的所有字段,然后写一个to_dict方法来将字段以及他的值封装成字典。大概的代码如下所示: 这种做法虽然

    2024年02月16日
    浏览(43)
  • org.springframework.data.redis.serializer.SerializationException: Cannot serialize(解决redis存入对象序列化)

    在调用service 实现类时报出以上错误,原因是因为 spring会先将对象序列化,再存入redis进行缓存,而entity没有实现序列化接口,因此序列化出错,需要在对应的实体类中添加序列化即可(implements Serializable),如下:

    2024年02月14日
    浏览(45)
  • 使用nlohmann json库进行序列化与反序列化

    nlohmann源码仓库:https://github.com/nlohmann/json 使用方式:将其nlohmann文件夹加入,包含其头文件json.hpp即可 demo

    2024年02月10日
    浏览(40)
  • Spring Boot 中使用 ObjectMapper 进行 JSON 序列化和反序列化

    在 Java 中,可以使用各种 JSON 序列化和反序列化工具将 Java 对象转换为 JSON 字符串或者将 JSON 字符串转换为 Java 对象。其中,Jackson 库是比较常用的 JSON 序列化和反序列化工具之一,它提供了 ObjectMapper 类,用于将 Java 对象转换为 JSON 字符串,或者将 JSON 字符串转换为 Java 对象

    2024年02月14日
    浏览(44)
  • 在Unity中使用Protobuf进行序列化

    目录 1.介绍 1.1 什么是Protobuf 1.2 Protobuf和其他数据序列化方案对比 2.下载Protobuf 2.1 方案一 使用VS的Nuget包管理器进行安装(推荐) 2.1.1安装Protobuff包 2.1.2拷贝.dll文件 2.2 方案二 从Github下载并自己生成.dll 2.2.1 下载Probuff 2.2.2 VS打开解决方案 2.2.3 安装.NET SDK 2.2.4 生成.dll文件 3

    2024年04月12日
    浏览(52)
  • c++ 使用rapidjson对数据序列化和反序列化(vs2109)

      RapidJSON是腾讯开源的一个高效的C++ JSON解析器及生成器,它是只有头文件的C++库,综合性能是最好的。 1. 安装 在NuGet中为项目安装tencent.rapidjson 2. 引用头文件 #include rapidjson/document.h #include rapidjson/memorystream.h #include rapidjson/prettywriter.h 3. 头文件定义 添加测试json字符串和类型

    2024年02月07日
    浏览(37)
  • 细谈使用CodeQL进行反序列化链的挖掘过程

    学习了一下CodeQL的各种使用方式,决定使用CodeQL细谈一下CC链挖掘,通过一步一步的朝着我们既定的目标进行靠近,最终成功的找到了一条鸡肋的二次反序列化的入口 CodeQL本身包含两部分解析引擎+  SDK  。 解析引擎用来解析我们编写的规则,虽然不开源,但是我们可以直接

    2024年02月05日
    浏览(31)
  • .NET根据类的值进行序列化反序列化操作

    前言: 在.NET种,序列化一般常用的方式是使用Newtonsoft.Json进行序列化和反序列化操作,比如创建一个Person类 序列化为json 得到的json如下  反序列化 以上方法是我们经常用的方法,但是现实中总有奇葩(跟我一起读:sha bi)的需求,以上序列化方式,是将Person的name序列化为

    2024年02月13日
    浏览(47)
  • 【探索Linux】P.30(序列化和反序列化 | JSON序列化库 [ C++ ] )

    当谈到网络编程时,序列化和反序列化是非常重要的概念。在上一篇文章中,我们已经了解了在Linux环境下实现简单的TCP网络程序的基础知识。本文将继续探讨序列化和反序列化,这些概念对于在网络上传输数据以及跨网络通信至关重要。通过深入了解序列化和反序列化,我

    2024年04月08日
    浏览(89)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包