我有一个如下所示的数据结构:
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的套接字.
我很确定我有适合这项工作的工具 - 我只是需要帮助才能让它们协同工作.写入套接字与写入文件不同,对吧?
任何建议都非常感谢.谢谢!
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);
我以为我会和那些试图struct
使用Boost 序列化C++的人分享这个.对于上面给出的示例,要生成可struct
序列化,您将添加一个serialize
函数:
typedef struct { unsigned short m_short1; unsigned short m_short2; unsigned char m_character; templatevoid serialize(Archive& ar, const unsigned int version) { ar & m_short1; ar & m_short2; ar & m_character; } } MyDataType;
对于这种简单的结构,boost :: serialization是过度杀伤和巨大的开销.
更简单:
vectornet(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 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]);
并且节省了自己的巨大开销,即boost :: serialization
如果你的私有协议,其中具有相同字节顺序的计算机工作(大/小),只发送结构 - POD.