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代码更好
消息
实例:
(也可以从流中读取,以避免将整个消息字符串读取到内存中。)谢谢!这样就可以了,因为这是暂时的。我现在不需要可移植性,也不需要长期兼容性,如果需要的话,我会在以后编写一个编辑器。谢谢你的选择,但我会尝试使用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();