【问题标题】:Does google protocol buffers support size calculation before serialization?谷歌协议缓冲区是否支持序列化前的大小计算?
【发布时间】:2010-11-15 14:51:55
【问题描述】:

我的 (DSP) 应用程序以恒定速率生成数据。速率取决于用户选择的配置。我想知道每秒生成多少字节。数据结构包含一个重复的(打包的)浮点字段。字段的长度是恒定的,但可以由用户更改。

是否有一个protocol buffers函数可以在序列化之前计算消息大小?

【问题讨论】:

    标签: c++ protocol-buffers


    【解决方案1】:

    如果您已经构建了消息对象,您可以在消息上调用 ByteSize(),它返回序列化消息将占用的字节数。有一个指向 ByteSize 的 C++ 文档的链接。

    【讨论】:

    • python 有没有类似 ByteSize() 的 api?我看到this 什么也没找到
    • 对于 Go 有 proto.Size() 函数:pkg.go.dev/google.golang.org/protobuf/proto#Size
    • 这不能回答 OP 的问题。通过“构建”消息,隐含了序列化。为了。例如。如果消息中存在 RepeatedField,则 Protobuf 无法提前告知所需的内存量。
    【解决方案2】:

    不可能提前知道,因为 protobuf 将提供给它的结构打包成尽可能少的字节 - 例如,它不会为 int x = 1; 使用四个字节 - 所以库必须遍历整个图表知道输出大小。

    我相信您可以通过对您自己设计的符合 protobuf 的流执行序列化操作来发现这一点,该流只计算给定的字节数。这可能会很昂贵,但不会比图书馆做这项工作的成本高。

    【讨论】:

    • 我们如何强制它使用 4 个字节的 int 并且不打包它,以获得固定大小的序列化数据?
    • 如果您使用 ProtoBuf OutputStream 类自己序列化数据,您可以通过对每个基本类型使用 Write 方法而不是 varint 编码来完成此操作 - 请参阅 developers.google.com/protocol-buffers/docs/encoding
    【解决方案3】:

    您可以在不发送的情况下填写消息,然后调用CalculateSize()就可以了

    【讨论】:

      猜你喜欢
      • 2013-09-16
      • 2010-11-06
      • 2014-09-13
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 2017-05-15
      相关资源
      最近更新 更多