Protobuf - 来自同一类的多条消息

时间:2017-10-11 17:32:07

标签: java protocol-buffers

我在proto文件中有以下消息

message User
required string name = 1;
required string password = 2;
  • 如何区分同一邮件的多个实例?
  • 如果我想序列化某个应用的注册用户
  • 是否表明了protobuf?

1 个答案:

答案 0 :(得分:0)

这仅适用于一些额外的编码。当protobuf从流中读取消息时,它不知道一条消息的长度。它只看到一个字段流作为名称/值对,并且没有指示消息的开始或结束。

来自docs

  

如果要将多条消息写入单个文件或流,则需要跟踪一条消息的结束位置和下一条消息的开始位置。协议缓冲区有线格式不是自定界限的,因此协议缓冲区解析器无法确定消息自己的结束位置。

Google的实现包含一些此用例的帮助程序类。请查看CodedInputStreamCodedOutputStream

写作的一种可能方式:

  • 一个对象序列化为内存缓冲区
  • 使用CodedOutputStream将缓冲区的长度作为单个数字写入输出流
  • 将包含序列化对象的内存缓冲区添加到输出流
  • 继续下一个对象

阅读的一种可能方式:

  • 使用CodedInputStream从输入流中读取一个数字
  • 从输入流中获取尽可能多的字节,因为此数字表示内存缓冲区
  • 解析此缓冲区以重新获得一个对象
  • 如果输入流有更多字节继续下一个对象