谷歌协议缓冲区是不是支持序列化前的大小计算?

Posted

技术标签:

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

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

是否有一个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()就可以了

【讨论】:

以上是关于谷歌协议缓冲区是不是支持序列化前的大小计算?的主要内容,如果未能解决你的问题,请参考以下文章

提升序列化与谷歌协议缓冲区? [关闭]

iOS 网络 - Moya 和协议缓冲区序列化

协议缓冲区比序列化更好?

Google 协议缓冲区可以在不同语言之间进行序列化/解析吗?

Google 协议缓冲区可以在不同语言之间进行序列化/解析吗?

反序列化缓冲区协议缓冲区