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)

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Boost序列化库和QTsocket库来发送和接收`std::vector<cv::Vec6f>`对象。下面是一个简单的示例代码: ```cpp #include <boost/archive/text_oarchive.hpp> #include <boost/archive/text_iarchive.hpp> #include <boost/serialization/vector.hpp> #include <QTcpSocket> #include <QDataStream> // 序列化函数 template<class Archive> void serialize(Archive& ar, cv::Vec6f& vec, const unsigned int version) { ar & vec[0]; ar & vec[1]; ar & vec[2]; ar & vec[3]; ar & vec[4]; ar & vec[5]; } int main() { std::vector<cv::Vec6f> dataToSend; // 填充数据到dataToSend // 创建QTcpSocket对象 QTcpSocket socket; // 连接到服务器 socket.connectToHost("server_address", port_number); if (socket.waitForConnected()) { // 创建QDataStream对象来写入数据 QDataStream stream(&socket); // 使用Boost序列化库将数据序列化为字符串 std::stringstream ss; boost::archive::text_oarchive oa(ss); oa << dataToSend; std::string serializedData = ss.str(); // 将序列化的数据发送到服务器 stream << QString::fromStdString(serializedData); } // 接收数据 if (socket.waitForReadyRead()) { // 创建QDataStream对象来读取数据 QDataStream stream(&socket); QString receivedData; // 从服务器接收数据 stream >> receivedData; // 使用Boost序列化库将接收到的数据反序列化为std::vector<cv::Vec6f>对象 std::string serializedData = receivedData.toStdString(); std::stringstream ss(serializedData); boost::archive::text_iarchive ia(ss); std::vector<cv::Vec6f> receivedVector; ia >> receivedVector; // 使用接收到的数据进行处理 // ... } // 关闭连接 socket.disconnectFromHost(); return 0; } ``` 请确保在编译时链接了Boost序列化库和QTsocket库,并根据实际情况替换`"server_address"`和`port_number`为服务器的地址和端口号。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值