首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java: JSON -> Protobuf &反向转换

Java: JSON -> Protobuf &反向转换
EN

Stack Overflow用户
提问于 2015-02-16 23:58:19
回答 10查看 133.9K关注 0票数 60

我有一个现有的系统,它在GUI和服务器之间使用基于协议的通信协议。现在,我想添加一些持久性,但目前protobuf消息直接转换为第三方自定义对象。

有没有办法将proto消息转换成json,然后保存到数据库中。

注:我不太喜欢将二进制协议写到数据库的想法,因为有一天它可能会变得不能向后兼容较新的版本,并以这种方式破坏系统。

EN

回答 10

Stack Overflow用户

发布于 2017-03-06 06:47:53

正如在an answer to a similar question中提到的,由于v3.1.0,这是ProtocolBuffers支持的特性。对于Java,包含扩展模块com.google.protobuf:protobuf-java-util并使用JsonFormat,如下所示:

JsonFormat.parser().ignoringUnknownFields().merge(json, yourObjectBuilder);
YourObject value = yourObjectBuilder.build();
票数 49
EN

Stack Overflow用户

发布于 2015-02-17 00:42:07

我们目前正在使用protobuf-java-format将我们的Protobuf消息(Message的任何子类)转换成JSON格式,以便通过我们的web API发送。

只需执行以下操作:

  JsonFormat.printToString(protoMessage)
票数 48
EN

Stack Overflow用户

发布于 2015-02-17 13:06:45

我不太喜欢将二进制协议写到数据库的想法,因为有一天它可能会变得不能向后兼容较新的版本,并以这种方式破坏系统。

将protobuf转换为JSON进行存储,然后在加载时转换回protobuf更有可能产生兼容性问题,因为:

  • 如果执行转换的进程不是使用最新版本的protobuf模式构建的,那么转换将静默地删除该进程不知道的任何字段。即使使用最新的模式,

<->

  • 转换在存在不精确的浮点值和类似的角cases.
  • Protobufs时也可能会有损失。实际上,JSON有(稍微)比JSON更强的向后兼容性保证。与JSON一样,如果您添加了一个新字段,旧客户端会忽略它。与JSON不同,Protobufs允许声明默认值,这可以使新客户端更容易处理缺少该字段的旧数据。这只是一个很小的优势,但除此之外,Protobuf和JSON具有相同的向后兼容性属性,因此您不会从存储在JSON中获得任何向后兼容性优势。

尽管如此,有许多库可以将协议转换为JSON,通常构建在Protobuf反射接口上(不要与Java反射接口混淆;Protobuf反射是由com.google.protobuf.Message接口提供的)。

票数 40
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28545401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档