Serialization protobuf消息的分隔符是什么?

Serialization protobuf消息的分隔符是什么?,serialization,protocol-buffers,Serialization,Protocol Buffers,protobuf消息的分隔符是什么?我正在处理序列化消息。我想知道消息是否以$$\u$$开头,以相同的符号结尾。对于顶级消息(即单独调用序列化):实际上没有。除非您添加自己的帧,否则消息会主动地相互渗透,因为反序列化程序(默认情况下)只会读取到流的末尾。因此:如果您在没有自己的帧协议的情况下盲目地连接多个对象:您现在有问题了 对于消息的内部,有两种编码子对象的方法-长度前缀和组。组在很大程度上是不推荐使用的,子对象的编码是不明确的,因为它也是描述字符串、blob(字节)和“压缩数组”的相同标记。

protobuf消息的分隔符是什么?我正在处理序列化消息。我想知道消息是否以$$\u$$开头,以相同的符号结尾。

对于顶级消息(即单独调用序列化):实际上没有。除非您添加自己的帧,否则消息会主动地相互渗透,因为反序列化程序(默认情况下)只会读取到流的末尾。因此:如果您在没有自己的帧协议的情况下盲目地连接多个对象:您现在有问题了

对于消息的内部,有两种编码子对象的方法-长度前缀和组。组在很大程度上是不推荐使用的,子对象的编码是不明确的,因为它也是描述字符串、blob(字节)和“压缩数组”的相同标记。你可能不想尝试处理这个问题


因此:听起来您需要添加自己的成帧协议,在这种情况下,答案将是:无论您的成帧协议定义了什么。请记住protobuf是二进制的,所以不能依赖任何字节序列作为前哨/终止符。理想情况下,您应该使用长度前缀方法。

协议缓冲线格式不是自定界的,因此协议缓冲区解析器无法自行确定消息的结束位置。解决此问题的最简单方法是在编写消息之前先编写每条消息的大小。当您读回消息时,您读取大小,然后将字节读入一个单独的缓冲区,然后从该缓冲区进行解析。

(除了现有答案之外,)

协议缓冲区的常用成帧方法是在实际protobuf消息之前预先添加一个

该实现已经是protobuf库的一部分,例如:

  • 对于java:

  • 对于C:标头中的方法(例如,
    SerializedDelimitedToFileDescriptor()

祝你的项目好运

编辑>声明:

如果您想将多条消息写入一个文件或流,则需要您跟踪一条消息的结束位置和下一条消息的开始位置。协议缓冲区连线格式不是自定界的,因此协议缓冲区解析器无法自行确定消息的结束位置。解决此问题的最简单方法是在编写消息之前先编写每条消息的大小。当您读回消息时,您读取大小,然后将字节读入一个单独的缓冲区,然后从该缓冲区进行解析。(如果您希望避免将字节复制到单独的缓冲区中,请检查CDEDIN)(C++java)C++类,它可以被告知将读取限制为一定数量的字节。
protobuf 2和3编译器就是这样吗?你可能知道吗?我明白了你想解释的内容。这肯定是我必须重新考虑的事情,我想从更大的角度来看。@MarkoBencik无论你使用哪种DSL(proto2/proto3)或编译器或其他工具,二进制协议都是相同的。二进制协议本身:不终止最外层的消息。当接收者从一开始就获得ByTestStream时,这种方法工作得很好。我不太熟悉protobuf的字节流,但我不确定如果接收器部分通过ByTestStream,它是否有效,因为可能很难区分定界变量和变量消息等@bazza我理解你的观点,但我担心在这个问题上没有这样的要求。Protobuf编码绝对不是自同步的。如果需要,则存在具有该属性的帧协议(例如)。我敢打赌,在大多数情况下,流的完整性是由上层保证的。请随意发布一个更好的答案想法……不,我没有更好的答案,你的答案非常好,肯定回答了这个问题!我只希望Protobuf引入了自同步,它会更有用。感谢关于COBS的提示,我之前已经编写了我自己的(我通常都能顺利完成),但是有一个库来代替它是很好的。经过一些讨论和思考后,决定在消息中添加标题来解决问题。Thnx每个人都需要输入。