序列化和反序列化是指将数据结构或对象转换为一组字节,以便在需要时可以将其存储在磁盘上或通过网络传输,并且可以在需要时重新创建原始对象或数据结构。

序列化是将内存中的对象转换为字节的过程。在序列化期间,对象的状态被编码为一组字节,并可以保存或传输到另一个位置。序列化后的字节可以在之后进行反序列化,以将对象重建为在序列化之前的状态。

反序列化则是将字节序列重新转换为对象或数据结构的过程。在反序列化期间,字节被反转回原始对象的状态,以便它可以被使用或操作。

在Boost库中,提供了text_oarchivetext_iarchive于将C对象序列化为文本格式并将其反序列化回去,使用text_oarchive可以将C对象以可读文本形式输出,以便在文件或网络上进行存储或传输,与之对应的text_iarchive则可以将先前序列化的文本格式数据还原为C对象。

首先来看服务端代码,在代码中我们定义一个自定义MyDate结构体,该结构体内包含了一个serialize该函数适用于序列化与反序列化时使用的,当我们调用struct_load函数时,就会触发这个序列化方法,从而将接收到的序列化数据包反序列化为对应的结构体变量,这样我们就可以自由的解析内部参数。

#include <iostream>
#include <sstream>
#include <boost/asio.hpp> #include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp> using namespace std;
using namespace boost::asio; typedef struct MyDate
{
unsigned int m_day;
unsigned int m_month;
unsigned int m_year; MyDate(int d, int m, int y)
{
m_day = d;
m_month = m;
m_year = y;
}
MyDate()
{
m_day = 0;
m_month = 0;
m_year = 0;
} template<typename Archive>
void serialize(Archive& archive, const unsigned int version)
{
archive & BOOST_SERIALIZATION_NVP(m_day);
archive & BOOST_SERIALIZATION_NVP(m_month);
archive & BOOST_SERIALIZATION_NVP(m_year);
}
}MyDate; MyDate struct_load(std::string load_string)
{
MyDate item;
std::istringstream is(load_string);
boost::archive::text_iarchive archive(is); archive >> item;
return item;
} int main(int argc, char* argv[])
{
io_service io_service;
ip::tcp::acceptor acceptor(io_service, ip::tcp::endpoint(ip::tcp::v4(), 6666));
ip::tcp::socket socket(io_service); acceptor.accept(socket);
boost::system::error_code error_code; // 接收序列化后的数据
char recv_buffer[8196] = { 0 };
socket.read_some(boost::asio::buffer(recv_buffer, 8196), error_code); // 反序列化接收到的数据
MyDate ptr;
ptr = struct_load(recv_buffer);
std::cout << "反序列化: " << ptr.m_year << std::endl; std::system("pause");
return 0;
}

接着我们来分析一下客户端代码实现,对于客户端而言我们同样需要定义一个完全一致的MyDate结构体,当调用struct_save函数时则会将传入的结构体参数序列化为一个字符串,此时通过调用write_some即可将压缩后的结构体传输给服务端。

#include <iostream>
#include <sstream>
#include <string>
#include <boost/asio.hpp> #include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp> using namespace std;
using namespace boost::asio; typedef struct MyDate
{
unsigned int m_day;
unsigned int m_month;
unsigned int m_year; MyDate(int d, int m, int y)
{
m_day = d;
m_month = m;
m_year = y;
}
MyDate()
{
m_day = 0;
m_month = 0;
m_year = 0;
} template<typename Archive>
void serialize(Archive& archive, const unsigned int version)
{
archive & BOOST_SERIALIZATION_NVP(m_day);
archive & BOOST_SERIALIZATION_NVP(m_month);
archive & BOOST_SERIALIZATION_NVP(m_year);
}
}MyDate; std::string struct_save(MyDate *ptr)
{
std::ostringstream os;
boost::archive::text_oarchive archive(os);
archive & BOOST_SERIALIZATION_NVP(*ptr); std::string content = os.str();
return content;
} int main(int argc, char* argv[])
{ io_service io_service;
ip::tcp::socket socket(io_service);
ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 6666); boost::system::error_code error_code;
socket.connect(ep, error_code); // 序列化为字符串
MyDate save_data(12, 7, 1997);
std::string save_string = struct_save(&save_data);
std::cout << "序列化后: " << save_string << std::endl; // 发送给服务端
socket.write_some(boost::asio::buffer(save_string), error_code); std::system("pause");
return 0;
}

读者可自行编译运行这段代码片段,当两个程序运行时则会实现结构体的远程传输功能,如下图所示;

19.7 Boost Asio 传输序列化数据的更多相关文章

  1. boost::asio async_write也不能保证一次发完所有数据 二

    只有看boost源码才能弄明白发生了什么.首先我是将vector里面写入了数据,然后用boost::asio::buffer将vector构造成了mutable_buffer_1对象. 参考该文档的重 ...

  2. boost::asio async_write也不能保证一次发完所有数据 一

    你要是看过basic_stream_socket的文档,里面提到async_write_some不能保证将所有要发送的数据都发出去.并且提到如果想这样做,需要使用boost asio的async_wr ...

  3. qt+boost::asio+tcp文件传输

    客户端: void qt_boost::pbSendFileClicked(){ QString filename = ui.leFileName->text(); QByteArray ba ...

  4. 客户端技术的一点思考(数据存储用SQLite, XMPP通讯用Gloox, Web交互用LibCurl, 数据打包用Protocol Buffer, socket通讯用boost asio)

    今天看到CSDN上这么一篇< 彻底放弃没落的MFC,对新人的忠告!>, 作为一个一直在Windows上搞客户端开发的C++程序员,几年前也有过类似的隐忧(参见 落伍的感觉), 现在却有一些 ...

  5. BOOST.Asio——Overview

    =================================版权声明================================= 版权声明:原创文章 谢绝转载  啥说的,鄙视那些无视版权随 ...

  6. boost::asio译文

        Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENS ...

  7. Boost.Asio技术文档

    Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...

  8. Boost.Asio基本原理(CSDN也有Markdown了,好开森)

    Boost.Asio基本原理 这一章涵盖了使用Boost.Asio时必须知道的一些事情.我们也将深入研究比同步编程更复杂.更有乐趣的异步编程. 网络API 这一部分包含了当使用Boost.Asio编写 ...

  9. boost::asio 的同、异步方式

    转自:http://blog.csdn.net/zhuky/archive/2010/03/10/5364574.aspx Boost.Asio是一个跨平台的网络及底层IO的C++编程库,它使用现代C ...

  10. boost asio 异步实现tcp通讯

    ---恢复内容开始--- asioboost   目录(?)[-] 一前言 二实现思路 通讯包数据结构 连接对象 连接管理器 服务器端的实现 对象串行化   一.前言 boost asio可算是一个简 ...

随机推荐

  1. Lambda 表达式各种用法,你都会了吗

    公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 前言 Lambda表达式是 Java 8 中引入的最有影响力的功能之一.它们通过允许简洁而优雅地创建匿名函数来实现 Jav ...

  2. 【转】OS | 从一道面试题谈 Linux 下 fork 的运行机制

    今天一位朋友去一个不错的外企面试 Linux 开发职位,面试官出了一个如下的题目: 给出如下C程序,在 Linux 下使用 gcc 编译: #include "stdio.h" # ...

  3. Android 加载图片占用内存分析

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/aRDzmMlkqB14Ty67GJs9vg作者:Xu Jie 不同Android版本,对一张图 ...

  4. 【Qt】开源一键代码开光神器,一行代码给你的项目施加祝福,减少Bug

    年底啦,没什么项目,想摸鱼划水没见到什么好玩的东西,看到有人分享这个,直接做个库来玩下,之后说不定会嵌到公司的项目里面去.... 效果如下,佛光普照! 输入也只需要一行命令 magic_spells: ...

  5. 如何将接口的返回值中所需信息提取出来作为其他接口的入参使用(postman与jmeter的使用)

    一.背景: 偶尔会用到一个场景,两个接口之前的调用有依赖关系,将其中一个的返回参数中的部分信息取出来作为入参在第二个接口中使用,代码内是比较好实现,只要定义一个变量,用于参数传递. 如果是测试过程中使 ...

  6. [译] kubernetes:kube-scheduler 调度器代码结构概述

    本文翻译自 https://github.com/kubernetes/community/blob/master/contributors/devel/sig-scheduling/scheduli ...

  7. 文心一言 VS 讯飞星火 VS chatgpt (183)-- 算法导论13.4 7题

    七.用go语言,假设用 RB-INSERT 将一个结点 x 插入一棵红黑树,紧接着又用 RB-DELETE 将它从树中删除.结果的红黑树与初始的红黑树是否一样?证明你的答案. 文心一言: 首先,我们需 ...

  8. SV OOP-1

    内容 面向对象编程 面向对象的基本概念 对象没有办法直接操作,需要通过handle(指向对象的指针)进行操作 面向对象的基本术语 面向对象的优势 类的定义 实例化对象 new() - 产生具体对象,开 ...

  9. 【MLA】内存泄漏检查

    项目地址:skullboyer/MLA (github.com) 介绍 MLA 即 Memory Leak Analyzer,是一个排查内存泄漏的分析器 实现机制是在malloc时记录分配位置信息,在 ...

  10. [java] - JavaBeans 获取 session

    RegServlet // 保存到 session request.getSession().setAttribute("user", user); userinfo.jsp // ...