协议缓冲区可以解析“调试字符串”格式的消息吗?

时间:2011-08-14 11:16:43

标签: protocol-buffers

我想在我的程序中使用协议缓冲区来读取文件中的数据。我还希望能够使用任何文本编辑器编辑数据文件,以便开始(稍后我将编写数据编辑器,并切换到完整的二进制文件)。

有没有办法解析人类可读的格式? (protobuf本身提供的调试字符串,或其他一些格式)。

4 个答案:

答案 0 :(得分:5)

也有基于文本的格式,但对此的支持是特定于实现的。例如,我不支持protobuf-net中的 。但是:这是定义的,并在这里讨论(例如):http://code.google.com/apis/protocolbuffers/docs/reference/cpp/google.protobuf.text_format.html

就个人而言,我宁愿使用二进制文件并在模型周围编写UI。

答案 1 :(得分:4)

如果您不介意使用命令行工具,Piqi project包括piqi convert命令,用于在4种格式之间进行转换:二进制协议缓冲区,JSON,XML和Piq。 Piq格式专门用于在文本编辑器中查看和编辑数据。

答案 2 :(得分:1)

问题没有指定编程语言,我的答案只是关于Java。

在Java中,Message实例的toString方法返回人类可读的文本格式。然后可以通过TextFormat.merge将相同的格式解析为Message实例:

String messageString = ...
MyMessage.Builder builder = MyMessage.newBuilder();
TextFormat.merge(messageString, builder);
MyMessage newMessage = builder.build();

Variations of the merge method也可以从流中读取,以避免将整个消息字符串读入内存。)

答案 3 :(得分:0)

您确定要使用ProtoBuf吗?您可以先使用Json,然后以二进制格式切换到Bson或MessagePack。

Json / Bson组合的优势在于您可以为它们使用相同的库(Json.net)。我相信Bson虽然比ProtoBuf大一点。

或者您可以使用Json / MessagePack。从技术上讲,MessagePack是比Bson / ProtoBuf IMO更好的二进制格式。但是工具支持更糟糕,你需要一个单独的Json和MessagePack库。它支持Json所做的一切以及更多(特别是它可以在字典中使用字符串和整数键)。

MsgPack和ProtoBuf的快速比较:

  • 如果使用类似的结构,则产生的数据大小似乎具有可比性。
  • 编码/解码性能在很大程度上取决于实现,但我希望它具有相似的幅度
  • MsgPack更自我描述。 。在ProtoBuf中,您甚至不会看到某些内容是子消息还是blob。
  • MsgPack支持字典中的非整数键。这允许的一件事是当你不关心大小时按名称存储属性并切换到增益很大的整数。
  • MsgPack存储元素计数而不是数组/字典的大小。这样做的好处是,您不需要返回输出并始终适合大小,这使得编写序列化器更容易,并且可能提供更快的写入速度。另一方面,你不能轻易跳过元素,因为你不知道它的大小。
  • MsgPack自然支持Json的超集,因此您可以轻松地从Json迁移。
  • 使用ProtoBuf,工具支持,文档和受欢迎程度要​​好得多。特别是ProtoBuf.net看起来比可用于MsgPack的C#代码更好。