C++ C++;:如何使用Boost库将对象序列化/反序列化为二进制存档格式?

C++ C++;:如何使用Boost库将对象序列化/反序列化为二进制存档格式?,c++,serialization,boost,deserialization,C++,Serialization,Boost,Deserialization,我已经成功地使用Boost library将Employee对象序列化为文件格式,并且我想使用TCP/IP通信协议通过套接字发送它,但我猜该协议不适用于文件 我正在考虑将对象序列化并反序列化为二进制格式,但我不知道如何操作,我在互联网上没有找到示例,因此请您帮助我好吗 我将与您分享我的代码: #include <fstream> #include <boost/archive/text_iarchive.hpp> #include <boost/archive/te

我已经成功地使用Boost library将Employee对象序列化为文件格式,并且我想使用TCP/IP通信协议通过套接字发送它,但我猜该协议不适用于文件

我正在考虑将对象序列化并反序列化为二进制格式
,但我不知道如何操作,我在互联网上没有找到示例,因此请您帮助我好吗

我将与您分享我的代码:

#include <fstream>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
 
using namespace std;
 
class Employee {
private:
   friend class boost::serialization::access;
   int id;
   string name;
   float salary;
   template<class Archive>
   void serialize(Archive &a, const unsigned version){
      a & id & name & salary;
   }
public:
   Employee(){}
   Employee(int i, string n, float s):id(i),name(n),salary(s)
   {}
};
 
int main()
{
   const string filename = "emp.dat";
   Employee e1(11,"Harry",4500.00f);
   Employee e2(22,"Ravi",8800.00f);
   Employee e3(33,"Tim",6800.00f);
   Employee e4(44,"Rajiv",3400.00f);
 
   // Serialize and persist the object
   {
      std::ofstream outfile(filename);
      boost::archive::text_oarchive archive(outfile);
      archive << e1 << e2 << e3 << e4;
   }
 
   // Deserialize and restore the object
   Employee restored_e1;
   Employee restored_e2;
   Employee restored_e3;
   Employee restored_e4;
 
   {
      std::ifstream infile(filename);
      boost::archive::text_iarchive archive(infile);
      archive >> restored_e1 >> restored_e2
         >> restored_e3 >> restored_e4;
   }
   return 0;
}
#包括
#包括
#包括
使用名称空间std;
班级员工{
私人:
好友类boost::serialization::access;
int-id;
字符串名;
浮动工资;
模板
无效序列化(存档&a,常量未签名版本){
a&id、姓名和薪水;
}
公众:
雇员(){}
员工(整数i,字符串n,浮动s):id(i),姓名(n),工资(s)
{}
};
int main()
{
常量字符串filename=“emp.dat”;
雇员e1(11,“哈里”,4500.00f);
雇员e2(22,“拉维”,8800.00f);
雇员e3(33,“Tim”,6800.00f);
雇员e4(44,“拉吉夫”,3400.00f);
//序列化并持久化对象
{
std::ofstream outfile(文件名);
boost::archive::text\u oarchive归档(outfile);
已恢复存档\u e2
>>恢复的e3>>恢复的e4;
}
返回0;
}
[摘要]

a) 查找接受套接字的std::stream兼容类。(我认为boost asio有一个)

b) 创建文件句柄并为其指定套接字句柄

c) 警告:boost serialize归档概念不适合您尝试执行的操作。见下文

[详细信息]

首先,你在这里问的问题与文本或二进制文件格式无关。这两种方法原则上都适用于tcp/ip。文本以人类可读(文本)的形式序列化数据,而二进制将简单地用二进制表示替换可读(文本)。这与数据的去向无关

也就是说:您要做的是序列化到tcp/ip套接字,而不是文件。这是可能的,尽管目前还不清楚如何实现。boost serialize使用存档作为std::stream的包装器。如果您有一个将数据写入tcp/ip套接字而不是文件的流,那么这就是您想要的

[我的建议]

我先从c):警告开始。boost归档概念不容易通过套接字进行序列化。原因是通常每个文件只有一个存档。转换为套接字:每个连接只能序列化一个存档。如果需要序列化多个“存档”,则必须关闭连接并重新打开。关闭和重新打开需要时间

考虑到您还没有准备好std::otcpstream,我自己的方法是将我的存档序列化为std::o/istringstream,并通过TCP/IP发送整个字符串缓冲区。像这样:

   std::ostringstream out;
   {
      boost::text_archive outA(out);
      outA << do some serialization;
   }
   send_via_tcp(out.str());
std::ostringstream out;
{
boost::text_归档outA(out);

outA
我猜这个协议不适用于文件
,为什么你猜我们不能通过TCP发送文件?你没有从网站下载任何文本吗?@史前企鹅是的,它不适用于文件