19.7 Boost Asio 传输序列化数据
序列化和反序列化是指将数据结构或对象转换为一组字节,以便在需要时可以将其存储在磁盘上或通过网络传输,并且可以在需要时重新创建原始对象或数据结构。
序列化是将内存中的对象转换为字节的过程。在序列化期间,对象的状态被编码为一组字节,并可以保存或传输到另一个位置。序列化后的字节可以在之后进行反序列化,以将对象重建为在序列化之前的状态。
反序列化则是将字节序列重新转换为对象或数据结构的过程。在反序列化期间,字节被反转回原始对象的状态,以便它可以被使用或操作。
在Boost库中,提供了text_oarchive和text_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 传输序列化数据的更多相关文章
- boost::asio async_write也不能保证一次发完所有数据 二
只有看boost源码才能弄明白发生了什么.首先我是将vector里面写入了数据,然后用boost::asio::buffer将vector构造成了mutable_buffer_1对象. 参考该文档的重 ...
- boost::asio async_write也不能保证一次发完所有数据 一
你要是看过basic_stream_socket的文档,里面提到async_write_some不能保证将所有要发送的数据都发出去.并且提到如果想这样做,需要使用boost asio的async_wr ...
- qt+boost::asio+tcp文件传输
客户端: void qt_boost::pbSendFileClicked(){ QString filename = ui.leFileName->text(); QByteArray ba ...
- 客户端技术的一点思考(数据存储用SQLite, XMPP通讯用Gloox, Web交互用LibCurl, 数据打包用Protocol Buffer, socket通讯用boost asio)
今天看到CSDN上这么一篇< 彻底放弃没落的MFC,对新人的忠告!>, 作为一个一直在Windows上搞客户端开发的C++程序员,几年前也有过类似的隐忧(参见 落伍的感觉), 现在却有一些 ...
- BOOST.Asio——Overview
=================================版权声明================================= 版权声明:原创文章 谢绝转载 啥说的,鄙视那些无视版权随 ...
- boost::asio译文
Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENS ...
- Boost.Asio技术文档
Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENSE_1_ ...
- Boost.Asio基本原理(CSDN也有Markdown了,好开森)
Boost.Asio基本原理 这一章涵盖了使用Boost.Asio时必须知道的一些事情.我们也将深入研究比同步编程更复杂.更有乐趣的异步编程. 网络API 这一部分包含了当使用Boost.Asio编写 ...
- boost::asio 的同、异步方式
转自:http://blog.csdn.net/zhuky/archive/2010/03/10/5364574.aspx Boost.Asio是一个跨平台的网络及底层IO的C++编程库,它使用现代C ...
- boost asio 异步实现tcp通讯
---恢复内容开始--- asioboost 目录(?)[-] 一前言 二实现思路 通讯包数据结构 连接对象 连接管理器 服务器端的实现 对象串行化 一.前言 boost asio可算是一个简 ...
随机推荐
- 在Flutter中使用SetState无效?可能是忽略了这个!
这次是Flutter开发技术分享,解决的问题点来自本人实际的开发经历. 首先描述一下问题:在某个组件中调用setState()方法更新该组件状态,结果是无法做到更新效果,组件仍然维持原状. 下面我们用 ...
- 用 Python 开发的 PDF 抽取Excel表格 2.0版
前些天向大家介绍了我开发的从PDF抽取表格小工具的使用方法(️点击直达),有同学反馈说有一些问题: 一页PDF有多张表,只能抽取第一个 有些表格线条是透明的,无法抽取 一页一页处理太麻烦,不能一次性抽 ...
- AtCoder Beginner Contest 185 题解
A - ABC Preparation 排序找出最小值 int main() { ios_base::sync_with_stdio(false), cin.tie(0); vector<int ...
- jdk1.8(java8)新特性
借鉴之:https://blog.csdn.net/qq_28410283/article/details/80601495 Lambda 表达式: //1.Lambda 表达式,也可称为闭包,它是推 ...
- ASP.NET Core 5.0 MVC 视图组件的用法
什么是视图组件 视图组件与分部视图类似,但它们的功能更加强大. 视图组件不使用模型绑定,并且仅依赖调用时提供的数据.它也适用于 Razor 页. 视图组件: 呈现一个区块而不是整个响应. 包括控制器和 ...
- zzuli 1907: 小火山的宝藏收益
***题意:中文的 做法:邻接表+DFS,就相当于搜一棵树,比较一下当前结点得到的宝藏多还是子树下面得到的宝藏多,仔细想想就是水题*** #include<iostream> #inclu ...
- keystore 与 trust store 的区别 及 keytool 常用命令
本文为博主原创,未经允许不得转载: 1. key store 与 trust store 区别 2. java 配置 单向认证与双向认证的过程 3. key store 与 trust store 常 ...
- C++ ——vector数组笔记
vector 是 C++ 标准库中的一个动态数组容器(Sequence Container),它可以自动管理内存大小,可以在运行时根据需要动态增长或缩小.它是一个非常常用且强大的容器,用于存储一系列元 ...
- JavaScript合并多个数组
工作中经常会对数组进行合并,稍微总结一下常用的方法: concat JavaScript原生自带的函数,用法如下: let arr1 = [3, 5, 7]; let arr2 = [4, 78, 7 ...
- 【SHELL】反斜杠解决多个shell实例扩展
本意是想获取代码仓相对路径,代码如下 base_dir=`pwd` repo forall -c '{ user_dir=$(realpath --relative-to="$bas ...