Dat*_*Chu 6 c++ python protocol-buffers
我有重复的消息,我想存储在一个文件中.目前,我必须在另一条消息中包装此重复消息.有没有解决的办法?
package foo;
message Box {
required int32 tl_x = 1;
required int32 tl_y = 2;
required int32 w = 3;
required int32 h = 4;
}
message Boxes {
repeated Box boxes = 1;
}
Run Code Online (Sandbox Code Playgroud)
ala*_*rik 13
以下是Protocol Buffers文档中关于重复消息的"技术"部分:
如果要将多条消息写入单个文件或流,则需要跟踪一条消息的结束位置和下一条消息的开始位置.协议缓冲区有线格式不是自定界限的,因此协议缓冲区解析器无法确定消息自身的结束位置.解决此问题的最简单方法是在编写消息本身之前写入每条消息的大小.当您重新读取消息时,读取大小,然后将字节读入单独的缓冲区,然后从该缓冲区解析.(如果你想避免将字节复制到一个单独的缓冲区,请查看CodedInputStream类(在C++和Java中),可以告诉它将读取限制为一定的字节数.)
还有一种在C++和Java中实现它的传统方法.有关详细信息,请查看此Stack Overflow线程:Java中是否存在用于协议缓冲区分隔I/O函数的C++等效项?
Protobuf不支持此功能.它可用于序列化一条消息,但此序列化消息不包含有关其类型(Box或Box)和长度的信息.因此,如果您想存储多条消息,您还必须包含消息的类型和长度.编写算法(伪语言)可能如下所示:
for every message {
write(type_of_message) // 1 byte long
write(length_of_serialized_message) // 4 bytes long
write(serialized_message)
}
Run Code Online (Sandbox Code Playgroud)
加载算法:
while(end_of_file) {
type = read(1) // 1 byte
length = read(4) // 4 bytes
buffer = read(length)
switch (type) {
case 1:
deserialise_message_1(buffer)
case 2:
deserialise_message_2(buffer)
}
}
Run Code Online (Sandbox Code Playgroud)