在C++中使用POCO和grain对多个对象进行反序列化
Deserialization of multiple objects with POCO and cereal in C++
我正试图通过网络将一些对象从一个程序发送到另一个程序,使用POCO::Net来处理连接,使用谷物来处理序列化。
所有数据包都是从单个基础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...
}
问题是,当数据发送速度非常快时,许多数据包可能在套接字缓冲区中等待,而grain读取所有字节,但只反序列化第一个数据包,其余数据包将丢失。
有没有一种方法可以让麦片一次只读取一个数据包,或者反序列化多个数据包?或者,我应该在Poco的套接字流和麦片的档案之间制作某种缓冲区,发送数据大小,这样它就可以在将数据包传递给麦片之前一次读取一个数据包?
如果有人碰巧遇到同样的问题,以下是问题的原因:
while(socket.available())
即使缓冲区中有多个数据包,它也只迭代一次(grain归档从socket中获取所有数据,因此它没有任何可用数据,因此返回0(。
当出现新的数据包时,缓冲区将被重置,数据将丢失。
解决方案是不断从谷物中读取数据,直到没有更多数据为止。如果这是在一个单独的线程中运行的,即使(isRunning((({ia>>v;/…/}也足够了。
相关文章:
- 如何知道QDataStream不能反序列化某些内容
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 如何反序列化数组?
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 在C++中使用POCO和grain对多个对象进行反序列化
- 是否可以反序列化(从原始内存块)没有默认构造函数的对象?
- C++ RapidJson 帮助反序列化数组对象
- 提升序列化:SIGABRT 同时反序列化包含 std::shared_ptr 的对象上的 boost::shared_p
- Cpp:Cpp中的JSON解析器,提供支持序列化/反序列化功能,将JSON对象转换为用户定义的类
- 如何使用boost c++反序列化对和对象的向量
- C++:如何在不使用库的情况下序列化/反序列化对象
- 在C++中反序列化对象
- 使用 mixins 序列化/反序列化对象
- c++反序列化通过UDP从c#应用程序发送的对象
- 无法反序列化升压图对象
- C++ 如何序列化/反序列化对象
- 如何在堆上反序列化和创建对象
- 构造函数中C++中对象的反序列化