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可算是一个简 ...
随机推荐
- Mysql--binlog日志
一.简介 binlog日志也称二进制日志,记录了所有的DDL和DML( 除了数据查询语句 )语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的. 一般来说开启二进 ...
- Navigation的用法
一.Navigation的诞生 单个Activity嵌套多个Fragment的UI架构模式,已经被大多数的Android工程师所接受和采用.但是,对Fragment的管理一直是一件比较麻烦的事情.我们 ...
- 字符串匹配算法:Horspool算法
Horspool 字符串匹配算法对Boyer-Moore算法的简化算法. Horspool 算法是一种基于后缀匹配的方法,是一种"跳跃式"匹配算法,具有sub-linear亚线性时 ...
- kafka如何保证数据的消息不丢失(最简洁)
一.kafka 本身配置层面1.1.replication.factor 默认值1创建kafka的topic时候,每个分区设置的副本数, 根据broker数量酌情设置, 建议业界通常做法设置为3 1. ...
- Redis无法使用ip访问
问题: 启动redis服务,可以使用127.0.0.1配置并使用访问redis,但是换成IP地址就无法访问 127.0.0.1 可以 [root]# ./redis-cli -c -h 127 ...
- 如何使用单纯的`WebAssembly`
一般来说在.net core使用WebAssembly 都是Blazor ,但是Blazor渲染界面,.net core也提供单纯的WebAssembly这篇博客我将讲解如何使用单纯的WebAssem ...
- 关于编写C时的调试--VS,VSCODE,DEV-C++
1.问题 VS最大的问题是不支持scanf函数,后面的调试部分我就没试了,主要用VS来写C++ VSCODE是服了他的C/C++插件,我死活卡在debug中scanf的输入部分,集成终端根本无法输入, ...
- [转帖]SSL数字证书分类DV/OV/EV
SSL证书的分类主要是通过下面两个维度进行分类: 1.根据验证模式分类 根据CA机构对申请者的身份审核范围分为:DV证书.OV证书.EV证书. 1.1.DV证书(域名证书) DV(Domain Val ...
- [转帖]Guanaco, Llama, Vicuña, Alpaca该怎么区别
https://zhuanlan.zhihu.com/p/106262896 在智利和秘鲁高原区经常会遇到的一种动物让人十分挠头,学术点称呼就是骆驼科其中一个族群--羊驼属和骆马属.头疼在于,分不清楚 ...
- [转帖]用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具
https://www.zhihu.com/people/javajia-gou-ji-zhu-44/posts JDK命令行工具 在JDK的开发包中,除了大家熟知的java.exe和javac. ...