Mar*_*cik 4 serialization protocol-buffers
protobuf 消息的分隔符是什么?我正在处理序列化消息。我想知道消息是否以 $$__$$ 开头并以相同的符号结尾。
对于顶级消息(即对序列化的单独调用):字面上没有。除非您添加自己的框架,否则消息会积极地相互渗透,因为反序列化器(默认情况下)只会读取到流的末尾。所以:如果你在没有自己的框架协议的情况下盲目地连接多个对象:你现在有问题。
对于消息的内部结构,有两种编码子对象的方式——长度前缀和组。组在很大程度上已被弃用,并且子对象的编码不明确,因为它也是描述字符串、blob(字节)和“打包数组”的相同标记。你可能不想尝试处理那个。
所以:听起来您需要添加自己的成帧协议,在这种情况下,答案将是:无论您的成帧协议定义了什么。请记住,protobuf 是二进制的,因此您不能依赖任何字节序列作为标记/终止符。理想情况下,您应该使用长度前缀方法。
Protocol buffers 的常见成帧方法是在实际的 protobuf 消息之前添加varint。
该实现已经是 protobuf 库的一部分,例如:
对于java: MessageLite.writeDelimitedTo() , Parser.parseDelimitedFrom()
对于 C:标头google/protobuf/util/delimited_message_util.h中的方法(例如SerializeDelimitedToFileDescriptor())
祝你的项目好运!
编辑>官方参考指出:
如果您想将多条消息写入单个文件或流,则需要您跟踪一条消息的结束位置和下一条消息的开始位置。Protocol Buffer 有线格式不是自定界的,因此 Protocol Buffer 解析器无法自行确定消息的结束位置。解决此问题的最简单方法是在写入消息本身之前写入每条消息的大小。当您读回消息时,您会读取大小,然后将字节读入单独的缓冲区,然后从该缓冲区进行解析。(如果您想避免将字节复制到单独的缓冲区,请查看 CodedInputStream 类(在 C++ 和 Java 中),该类可以被告知将读取限制为一定数量的字节。)
| 归档时间: |
|
| 查看次数: |
3862 次 |
| 最近记录: |