我正在尝试通过TCP链接传输Cereal的序列化结果(二进制归档)。对于接收方来说,第一件事是决定需要多少字节(至少)来恢复消息对象,但似乎没有办法获得此信息。
这有什么保证吗?我之所以担心,是因为如果由可移植的二进制归档序列化,结果会大1个字节。我知道这是用来记录字节顺序的,但是接收方怎么会知道呢?我想出的唯一安全的方法是序列化消息并从输出流中获取大小。对于接收方来说,这看起来并不那么优雅。
发布于 2017-01-09 10:04:07
我自己找到了一个解决方案。在这里分享,以防对其他人也有用。
获取大小的最可靠方法是实际序列化数据,所以我所做的是在序列化过程中避免通常的内存分配/访问开销(当使用std::stringstream时)。
class COUNTER_BUFFER : public std::streambuf
{
private :
size_t mSize = 0;
private :
int_type overflow(int_type C)
{
return mSize++;
}
public :
size_t Size(void) const
{
return mSize;
}
};通常,从std::basic_streambuf派生的类应该将字符写入某个缓冲区(文件、字符串等),但这里它计算写入了多少字符(字节)。
下一步,将一个实例分配给std::basic_ostream,该实例将从Cereal传递到归档:
COUNTER_BUFFER Buffer;
std::basic_ostream<char> Stream(&Buffer);
cereal::BinaryOutputArchive Archive(Stream);对于只包含原始类型的数据结构,应该有一种方法可以在编译时获得序列化大小,但是使用这种非优化方法,我只能在运行时获得它。
这对我来说已经足够了。
https://stackoverflow.com/questions/41448415
复制相似问题