Protocol buffers 协议缓冲区是否可以解析“中的消息?”;“调试字符串”;格式?

Protocol buffers 协议缓冲区是否可以解析“中的消息?”;“调试字符串”;格式?,protocol-buffers,Protocol Buffers,我想在程序中使用协议缓冲区从文件中读取数据。首先,我还希望能够使用任何文本编辑器编辑数据文件(稍后我将编写一个数据编辑器,并切换到完全二进制) 有没有办法解析人类可读的格式?(protobuf本身提供的调试字符串,或其他格式)。也有一种基于文本的格式,但对这种格式的支持是特定于实现的。例如,我在protobuf net中根本不支持它。但是是的:这里定义并讨论了(例如): 就我个人而言,我宁愿使用二进制并围绕模型编写UI。您确定要使用ProtoBuf吗?您可以首先使用Json,然后以二进制格式切换

我想在程序中使用协议缓冲区从文件中读取数据。首先,我还希望能够使用任何文本编辑器编辑数据文件(稍后我将编写一个数据编辑器,并切换到完全二进制)


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

也有一种基于文本的格式,但对这种格式的支持是特定于实现的。例如,我在protobuf net中根本不支持它。但是是的:这里定义并讨论了(例如):


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

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

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

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

MsgPack和ProtoBuf的快速比较:

  • 如果使用类似的构造,则生成的数据大小似乎是可比较的
  • 编码/解码性能在很大程度上取决于实现,但我希望它具有类似的规模
  • MsgPack更能自我描述。在ProtoBuf中,您甚至看不到某个内容是子消息还是水滴
  • MsgPack支持字典中的非整数键。这允许在不关心大小的情况下按名称存储属性,并在增益较大的情况下切换到整数
  • MsgPack存储数组/字典的元素计数而不是大小。这样做的好处是,您不需要一直返回输出并适应大小,从而使编写序列化程序更容易,并可能提供更快的写入速度。另一方面,你不能轻易跳过一个元素,因为你不知道它的大小
  • MsgPack自然支持Json的超集,因此您可以轻松地从Json迁移
  • ProtoBuf的工具支持、文档和流行性都要好得多。尤其是ProtoBuf.net看起来比MsgPack可用的C代码更好

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

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

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


(也可以从流中读取,以避免将整个消息字符串读取到内存中。)

谢谢!这样就可以了,因为这是暂时的。我现在不需要可移植性,也不需要长期兼容性,如果需要的话,我会在以后编写一个编辑器。谢谢你的选择,但我会尝试使用protobuf。出于我的需要,所有的解决方案似乎都非常相似,所以我只是随意选择了一个。我很好奇:你认为MsgPack中的哪个暴徒更好?@Marc it's it’更多的自我描述肯定是一个很大的优势。在ProtoBuf中,我甚至不知道某个东西是子消息还是一个blob。非整数字典键也不错。因为其他的差异相对较小,但在大多数差异中,我稍微喜欢MsgPack;p(re blob/sub message)@Marc我不太在乎二进制与字符串的区别。在本文中,我关心的是,我可以在不知道DTD的情况下运行protobuf读取器,然后在不需要返回protobuf读取器的情况下处理其输出。
String messageString = ...
MyMessage.Builder builder = MyMessage.newBuilder();
TextFormat.merge(messageString, builder);
MyMessage newMessage = builder.build();