以下是一個使用 boost::serialization 序列化和反序列化一個結構體,
並使用 boost::asio 在網路上傳輸的簡單範例:
#include <iostream>
#include <sstream>
#include <boost/asio.hpp>
#include <boost/serialization/access.hpp>
#include <boost/serialization/string.hpp>
#include <boost/serialization/vector.hpp>
// 使用 boost::asio 命名空間
using namespace boost::asio;
// 定義要序列化和反序列化的結構體
struct Data {
int id; // ID
std::string name; // 名字
// 序列化模板函數
template <typename Archive>
void serialize(Archive &ar, const unsigned int version) {
// 將成員變量 id 序列化到 ar 中
ar & id;
// 將成員變量 name 序列化到 ar 中
ar & name;
}
};
// 定義 io_service 和 socket
io_service service;
ip::tcp::socket sock(service);
// 寫入資料到 socket
void writeData(const Data &data) {
// 建立字符串流
std::ostringstream archiveStream;
// 建立文本歸檔對像
boost::archive::text_oarchive archive(archiveStream);
// 將 data 序列化到歸檔中
archive << data;
// 將字符串流轉換為字符串
std::string outboundData = archiveStream.str();
// 將字符串寫入 socket
write(sock, buffer(outboundData));
}
// 從 socket 讀取資料
Data readData() {
// 建立 streambuf 對像
boost::asio::streambuf b;
// 從 socket 中讀取直到遇到換行符
read_until(sock, b, '\n');
// 建立字符串流,並使用 streambuf 初始化
std::istream archiveStream(&b);
// 建立文本歸檔對像
boost::archive::text_iarchive archive(archiveStream);
// 定義要儲存讀取到的資料的 Data 對像
Data data;
// 從歸檔中反序列化 data 對像
archive >> data;
return data;
}
int main() {
// 定義連接端點,使用本地 IP 地址,端口為 12345
ip::tcp::endpoint ep(ip::address::from_string("127.0.0.1"), 12345);
// 建立到端點的連接
sock.connect(ep);
// 定義要寫出的 Data 對像
Data dataOut = {1, "John"};
// 將資料寫入 socket
writeData(dataOut);
// 從 socket 讀取資料
Data dataIn = readData();
// 輸出讀取到的資料
std::cout << dataIn.id << ": " << dataIn.name << std::endl;
return 0;
}