Run*_*ble 22 c++ serialization boost boost-asio
我有一个如下所示的数据结构:
typedef struct { unsigned short m_short1; unsigned short m_short2; unsigned char m_character; } MyDataType;
我想使用boost :: serialization序列化这个数据结构,然后使用boost :: asio通过TCP/IP传输它,然后让另一个应用程序接收数据并使用相同的boost库对其进行反序列化.
我正在尝试关注boost :: serialization教程,(正如其他一些SO问题所示),但该示例专门用于写入/读取文件,而不是使用boost :: asio的套接字.
我很确定我有适合这项工作的工具 - 我只是需要帮助才能让它们协同工作.写入套接字与写入文件不同,对吧?
任何建议都非常感谢.谢谢!
hvi*_*tus 30
asio文档中有一个很好的序列化示例:server.cpp,stock.hpp,connection.hpp.
这是一个片段:
std::ostringstream archive_stream;
boost::archive::text_oarchive archive(archive_stream);
archive << your_struct;
outbound_data_ = archive_stream.str();
boost::asio::async_write(socket_,
boost::asio::buffer(outbound_data_), handler);
Run Code Online (Sandbox Code Playgroud)
Tym*_*mek 22
我以为我会和那些试图struct
使用Boost 序列化C++的人分享这个.对于上面给出的示例,要生成可struct
序列化,您将添加一个serialize
函数:
typedef struct
{
unsigned short m_short1;
unsigned short m_short2;
unsigned char m_character;
template <typename Archive>
void serialize(Archive& ar, const unsigned int version)
{
ar & m_short1;
ar & m_short2;
ar & m_character;
}
} MyDataType;
Run Code Online (Sandbox Code Playgroud)
对于这种简单的结构,boost :: serialization是过度杀伤和巨大的开销.
更简单:
vector<uint16_t> net(3,0);
net[0]=htons(data.m_short1);
net[1]=htons(data.m_short2);
net[2]=htons(data.character);
asio::async_write(socket,buffer((char*)&net.front(),6),callback);
vector<uint16_t> net(3,0);
asio::async_read(socket,buffer((char*)&net.front(),6),callback);
callback:
data.m_short1=ntohs(net[0]);
data.m_short2=ntohs(net[1]);
data.character=ntohs(net[2]);
Run Code Online (Sandbox Code Playgroud)
并且节省了自己的巨大开销,即boost :: serialization
如果你的私有协议,其中具有相同字节顺序的计算机工作(大/小),只发送结构 - POD.
归档时间: |
|
查看次数: |
35116 次 |
最近记录: |