当前位置:  开发笔记 > 编程语言 > 正文

使用Boost序列化并发送数据结构?

如何解决《使用Boost序列化并发送数据结构?》经验,为你挑选了3个好方法。

我有一个如下所示的数据结构:

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的套接字.

我很确定我有适合这项工作的工具 - 我只是需要帮助才能让它们协同工作.写入套接字与写入文件不同,对吧?

任何建议都非常感谢.谢谢!



1> hvintus..:

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);



2> Tymek..:

我以为我会和那些试图struct使用Boost 序列化C++的人分享这个.对于上面给出的示例,要生成可struct序列化,您将添加一个serialize函数:

typedef struct
{
  unsigned short m_short1;
  unsigned short m_short2;
  unsigned char m_character;

  template 
  void serialize(Archive& ar, const unsigned int version)
  {
    ar & m_short1;
    ar & m_short2;
    ar & m_character;
  }
} MyDataType;



3> Artyom..:

对于这种简单的结构,boost :: serialization是过度杀伤和巨大的开销.

更简单:

vector 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 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.


这并不能解决通常如何通过网络发送序列化数据(连接Boost Serialization和Asio)的问题.这只是回答了如何通过Boost :: Asio发送特定结构的问题
推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有