【发布时间】:2015-08-25 16:17:59
【问题描述】:
我有一些 protobuf 对象,我们称之为Msg,有一些重复的字段。我想序列化它并发送。但是我有包裹的最大限制,我可以发送。那么有没有可能把这个对象分成一些小对象呢?或者可以设置序列化对象的最大大小?
【问题讨论】:
标签: protocol-buffers
我有一些 protobuf 对象,我们称之为Msg,有一些重复的字段。我想序列化它并发送。但是我有包裹的最大限制,我可以发送。那么有没有可能把这个对象分成一些小对象呢?或者可以设置序列化对象的最大大小?
【问题讨论】:
标签: protocol-buffers
如documentation 中所述,protobuf 不会处理消息的开始和停止位置,因此您必须自己处理。
protobuf 序列化器的输出只是一个序列化的缓冲区。这意味着没有实用的方法来设置您发送的消息的最大大小,因此需要某种机制。
来自文档:
[...] 如果您想将多条消息写入单个文件或流,则由您来跟踪一条消息的结束位置和下一条消息的开始位置。协议缓冲区有线格式不是自定界的,因此协议缓冲区解析器无法自行确定消息的结束位置。解决此问题的最简单方法是在编写消息本身之前写入每条消息的大小。当您读回消息时,您读取大小,然后将字节读入单独的缓冲区,然后从该缓冲区解析。 [...]
根据您编写的语言,有些库可以为例如长度添加前缀。您可以使用的 TCP。
您还应该注意,在 TCP 套接字上发送多个 protobuf 时,它们可能会被缓冲以进行网络优化(连接)并一起发送。这意味着无论如何都需要某种分隔符。
【讨论】: