我想在我的程序中使用协议缓冲区来读取文件中的数据。我还希望能够使用任何文本编辑器编辑数据文件,以便开始(稍后我将编写数据编辑器,并切换到完整的二进制文件)。
有没有办法解析人类可读的格式? (protobuf本身提供的调试字符串,或其他一些格式)。
答案 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的快速比较: