热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java:JSON->Protobuf和后向转换

如何解决《Java:JSON->Protobuf和后向转换》经验,为你挑选了5个好方法。

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

有没有办法将原型消息转换为json,然后可以将其保存到数据库.

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



1> 小智..:

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

简单地说:

  JsonFormat.printToString(protoMessage)


在新版本中,这似乎已更改为`JsonFormat.printer()。print(MessageOrBuilder)`。

2> Ophir Radnit..:

正如在回答类似问题时所提到的,从v3.1.0开始,这是ProtocolBuffers的支持功能.对于Java,请包含扩展模块com.google.protobuf:protobuf-java-util并使用JsonFormat,如下所示:

JsonFormat.parser().ignoringUnknownFields().merge(json, yourObjectBuilder);
YourObject value = yourObjectBuilder.build();



3> Kenton Varda..:

我不太喜欢将二进制protobuf写入数据库的想法,因为它有一天会变得与新版本不向后兼容并以这种方式破坏系统.

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

如果执行转换的进程不是使用最新版本的protobuf架构构建的,那么转换将以静默方式删除该进程不知道的任何字段.存储和装载两端都是如此.

即使使用最新的模式,JSON <- > Protobuf转换在存在不精确的浮点值和类似的极端情况时也可能是有损的.

与JSON相比,Protobufs实际上具有(略微)更强的向后兼容性保证.与JSON一样,如果添加新字段,旧客户端将忽略它.与JSON不同,Protobufs允许声明一个默认值,这可以使新客户端更容易处理原本缺少该字段的旧数据.这只是一个小优势,但Protobuf和JSON具有相同的向后兼容性属性,因此您无法通过存储JSON获得任何向后兼容性优势.

尽管如此,有很多库可以将protobufs转换为JSON,通常建立在Protobuf反射界面上(不要与Java反射界面混淆; Protobuf反射由com.google.protobuf.Message界面提供).



4> Moses..:

除了Ophir的回答,JsonFormat甚至可以在protobuf 3.0之前使用.但是,这样做的方式有点不同.

在Protobuf 3.0+中,JsonFormat类是一个单例,因此执行类似下面的操作

String jsOnString= "";
JsonFormat.parser().ignoringUnknownFields().merge(json,yourObjectBuilder);

在Protobuf 2.5+中,以下内容应该有效

String jsOnString= "";
JsonFormat jsOnFormat= new JsonFormat();
jsOnString= jsonFormat.printToString(yourProtobufMessage);

这是我编写的教程的链接,该教程在TypeAdapter中使用JsonFormat类,可以注册到GsonBuilder对象.然后,您可以使用Gson的toJson和fromJson方法将原型数据转换为Java并返回.

回复牛仔裤.如果我们在文件中有protobuf数据并想要将其解析为protobuf消息对象,请使用merge方法TextFormat类.请参阅以下代码段:

// Let your proto text data be in a file MessageDataAsProto.prototxt
// Read it into string  
String protoDataAsString = FileUtils.readFileToString(new File("MessageDataAsProto.prototxt"));

// Create an object of the message builder
MyMessage.Builder myMsgBuilder = MyMessage.newBuilder();

// Use text format to parse the data into the message builder
TextFormat.merge(protoDataAsString, ExtensionRegistry.getEmptyRegistry(), myMsgBuilder);

// Build the message and return
return myMsgBuilder.build();


这个用于PROTO到3.0+的JSON:`JsonFormat.printer().print(MessageOrBuilder)`

5> 小智..:

试试看JsonFormat.printer().print(MessageOrBuilder),它对proto3看起来不错。但是,目前尚不清楚如何将实际protobuf消息(由我在.proto文件中定义的Java包提供)转换为com.google.protbuf.Message对象。


推荐阅读
  • EasyMock实战指南
    本文介绍了如何使用EasyMock进行单元测试,特别是当测试对象的合作者依赖于外部资源或尚未实现时。通过具体的示例,展示了EasyMock在模拟对象行为方面的强大功能。 ... [详细]
  • XWiki 数据模型开发指南
    本文档不仅介绍XWiki作为一个增强版的wiki引擎,还深入探讨了其数据模型,该模型可在用户界面层面被充分利用。借助其强大的脚本能力,XWiki的数据模型支持从简单的应用到复杂的系统构建,几乎无需直接接触XWiki的核心组件。 ... [详细]
  • 本文探讨了浏览器的同源策略限制及其对 AJAX 请求的影响,并详细介绍了如何在 Spring Boot 应用中优雅地处理跨域请求,特别是当请求包含自定义 Headers 时的解决方案。 ... [详细]
  • 大数据基础:JavaSE_day06 ... [详细]
  • 本文深入探讨了JavaScript中实现继承的四种常见方法,包括原型链继承、构造函数继承、组合继承和寄生组合继承。对于正在学习或从事Web前端开发的技术人员来说,理解这些继承模式对于提高代码质量和维护性至关重要。 ... [详细]
  • 本文探讨如何利用Java反射技术来模拟Webwork框架中的URL解析过程。通过这一实践,读者可以更好地理解Webwork及其后续版本Struts2的工作原理,尤其是它们在MVC架构下的角色。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 本文详细介绍了如何在Java中使用org.apache.xalan.templates.AVTPartSimple类,并提供了多个实际的代码示例,帮助开发者更好地理解和运用这一类。 ... [详细]
  • ▶书中第四章部分程序,包括在加上自己补充的代码,有边权有向图的邻接矩阵,FloydWarshall算法可能含负环的有边权有向图任意两点之间的最短路径●有边权有向图的邻接矩阵1 ... [详细]
  • 利用YAML配置Resilience4J的Circuit Breaker
    本文探讨了Resilience4j作为现代Java应用程序中不可或缺的容错工具,特别介绍了如何通过YAML文件配置Circuit Breaker以提高服务的弹性和稳定性。 ... [详细]
  • 掌握Spring MVC中自定义类型转换与格式化的技巧
    近期,在开发一款小程序的过程中遇到了几个Spring MVC接口需要传递时间参数的问题。本文将详细介绍如何利用Java 8 Time API在Spring MVC中实现时间参数的自定义类型转换和格式化。 ... [详细]
  • 详细指南:使用IntelliJ IDEA构建多模块Maven项目
    本文在前两篇文章的基础上,进一步指导读者如何在IntelliJ IDEA中创建和配置多模块Maven项目。通过详细的步骤说明,帮助读者掌握项目模块化管理的方法。 ... [详细]
  • protobuf 安装_protobuf详解
    protobuf详解一、什么是protobufprotobuf全称GoogleProtocolBuffers,是google开发的的一套用于数据存储,网络通信时用于协议编解码的工具 ... [详细]
  • gRPC框架学习:2、ProtocolBuffers学习文章目录gRPC框架学习:2、ProtocolBuffers学习1.前言2.定义消息类型(1). ... [详细]
  • 由于@sami-hult,刚刚学习了如何加密二进制文件-我发现我也无法解密!我收到协 ... [详细]
author-avatar
回忆的沙漏2502890423
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有