在 C++ 中使用 POCO 和 cereal 反序列化多个对象
Deserialization of multiple objects with POCO and cereal in C++
我正在尝试通过网络将一些对象从一个程序发送到另一个程序,使用 POCO::Net 处理连接并使用 cereal 处理序列化。
所有数据包都继承自单一基础BasePacket。
class BasePacket {};
typedef std::shared_ptr<BasePacket> BasePacketPtr;
这是我发送数据的方式:
Poco::Net::StreamSocket &socket; //passed as an argument
Poco::Net::SocketOutputStream os(socket);
while (!sendQueue.empty()) {
BasePacketPtr v;
v = sendQueue.front();
{ //block to make sure that cereal flushes everything
cereal::BinaryOutputArchive oa(os);
oa << v;
}
sendQueue.pop();
}
os.flush();
这就是我接收数据的方式:
Poco::Net::StreamSocket &socket; //passed as an argument
Poco::Net::SocketInputStream is(socket);
cereal::BinaryInputArchive ia(is);
BasePacketPtr v;
while(socket.available()) {
ia >> v;
//do sth with v...
}
问题在于,当数据发送速度非常快时,套接字缓冲区中可能会等待很多数据包,而 cereal 会读取所有字节,但只会反序列化第一个数据包,其余数据包都会丢失。
有没有办法让谷物一次只读取一个数据包或反序列化多个数据包?或者我应该在 Poco 的 socketstream 和 cereal 的存档之间创建某种缓冲区来发送数据大小,以便它可以在将它传递给 cereal 之前一次读取一个数据包?
万一有人碰巧遇到同样的问题,这里是问题的原因:
while(socket.available())
这只会迭代一次,即使缓冲区中有多个数据包(谷物存档从套接字获取所有数据,因此它没有任何可用数据,因此它 returns 0) .
当出现新数据包时,缓冲区会重置并且数据会丢失。
解决方案是继续从 cereal achieve 读取数据,直到没有更多数据为止。如果这是 运行 在一个单独的线程中,即使 while(isRunning()) { ia >> v; /.../ } 就足够了。
我正在尝试通过网络将一些对象从一个程序发送到另一个程序,使用 POCO::Net 处理连接并使用 cereal 处理序列化。
所有数据包都继承自单一基础BasePacket。
class BasePacket {};
typedef std::shared_ptr<BasePacket> BasePacketPtr;
这是我发送数据的方式:
Poco::Net::StreamSocket &socket; //passed as an argument
Poco::Net::SocketOutputStream os(socket);
while (!sendQueue.empty()) {
BasePacketPtr v;
v = sendQueue.front();
{ //block to make sure that cereal flushes everything
cereal::BinaryOutputArchive oa(os);
oa << v;
}
sendQueue.pop();
}
os.flush();
这就是我接收数据的方式:
Poco::Net::StreamSocket &socket; //passed as an argument
Poco::Net::SocketInputStream is(socket);
cereal::BinaryInputArchive ia(is);
BasePacketPtr v;
while(socket.available()) {
ia >> v;
//do sth with v...
}
问题在于,当数据发送速度非常快时,套接字缓冲区中可能会等待很多数据包,而 cereal 会读取所有字节,但只会反序列化第一个数据包,其余数据包都会丢失。
有没有办法让谷物一次只读取一个数据包或反序列化多个数据包?或者我应该在 Poco 的 socketstream 和 cereal 的存档之间创建某种缓冲区来发送数据大小,以便它可以在将它传递给 cereal 之前一次读取一个数据包?
万一有人碰巧遇到同样的问题,这里是问题的原因:
while(socket.available())
这只会迭代一次,即使缓冲区中有多个数据包(谷物存档从套接字获取所有数据,因此它没有任何可用数据,因此它 returns 0) .
当出现新数据包时,缓冲区会重置并且数据会丢失。
解决方案是继续从 cereal achieve 读取数据,直到没有更多数据为止。如果这是 运行 在一个单独的线程中,即使 while(isRunning()) { ia >> v; /.../ } 就足够了。