首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何知道Cereal的二进制输出的大小?

我如何知道Cereal的二进制输出的大小?
EN

Stack Overflow用户
提问于 2017-01-04 00:50:27
回答 1查看 1.1K关注 0票数 3

我正在尝试通过TCP链接传输Cereal的序列化结果(二进制归档)。对于接收方来说,第一件事是决定需要多少字节(至少)来恢复消息对象,但似乎没有办法获得此信息。

这有什么保证吗?我之所以担心,是因为如果由可移植的二进制归档序列化,结果会大1个字节。我知道这是用来记录字节顺序的,但是接收方怎么会知道呢?我想出的唯一安全的方法是序列化消息并从输出流中获取大小。对于接收方来说,这看起来并不那么优雅。

EN

回答 1

Stack Overflow用户

发布于 2017-01-09 10:04:07

我自己找到了一个解决方案。在这里分享,以防对其他人也有用。

获取大小的最可靠方法是实际序列化数据,所以我所做的是在序列化过程中避免通常的内存分配/访问开销(当使用std::stringstream时)。

代码语言:javascript
复制
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传递到归档:

代码语言:javascript
复制
COUNTER_BUFFER Buffer;
std::basic_ostream<char> Stream(&Buffer);
cereal::BinaryOutputArchive Archive(Stream);

对于只包含原始类型的数据结构,应该有一种方法可以在编译时获得序列化大小,但是使用这种非优化方法,我只能在运行时获得它。

这对我来说已经足够了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41448415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档