热门标签 | 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对象。


推荐阅读
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Google ProtoBuf的使用
    Google的protobuf太好用了,又小,读写又快跑步快慢受鞋的影响太大了,但是造鞋的工具研究起来还是很有难度的,百度 ... [详细]
  • Go实战--golang中使用gRPC和Protobuf实现高性能api(golangprotobuf、google.golang.orggrpc),Go语言社区,Golang程序 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 花瓣|目标值_Compose 动画边学边做夏日彩虹
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Compose动画边学边做-夏日彩虹相关的知识,希望对你有一定的参考价值。引言Comp ... [详细]
  • 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?Input测 ... [详细]
  • egret protobufjs安装使用
    先安装好nodeprotobufjsgithub地址:https:github.comdcodeIOprotobuf.js#installation安装:npminstallprotobufjs-g安装全局protobufjsnpm ... [详细]
  • gRPC框架学习:2、ProtocolBuffers学习文章目录gRPC框架学习:2、ProtocolBuffers学习1.前言2.定义消息类型(1). ... [详细]
  • 我正在尝试将一些索引和浮点值保存到tfrecords,并使用tf.data ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
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社区 版权所有