CN113434147A - 基于ProtoBuf协议的消息解析方法及装置 - Google Patents
基于ProtoBuf协议的消息解析方法及装置 Download PDFInfo
- Publication number
- CN113434147A CN113434147A CN202110713455.8A CN202110713455A CN113434147A CN 113434147 A CN113434147 A CN 113434147A CN 202110713455 A CN202110713455 A CN 202110713455A CN 113434147 A CN113434147 A CN 113434147A
- Authority
- CN
- China
- Prior art keywords
- message
- protobuf
- class
- data interaction
- protocol
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000004458 analytical method Methods 0.000 title claims description 21
- 230000003993 interaction Effects 0.000 claims abstract description 87
- 238000000034 method Methods 0.000 claims abstract description 39
- 238000004590 computer program Methods 0.000 claims description 6
- 230000008569 process Effects 0.000 description 13
- 230000006870 function Effects 0.000 description 10
- 238000010586 diagram Methods 0.000 description 4
- 238000005516 engineering process Methods 0.000 description 4
- 230000011664 signaling Effects 0.000 description 3
- 239000000872 buffer Substances 0.000 description 2
- 238000012300 Sequence Analysis Methods 0.000 description 1
- 230000006978 adaptation Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 230000008878 coupling Effects 0.000 description 1
- 238000010168 coupling process Methods 0.000 description 1
- 238000005859 coupling reaction Methods 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000014509 gene expression Effects 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/427—Parsing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Abstract
本公开关于一种基于ProtoBuf协议的消息解析方法及装置。所述方法包括:第二数据交互方获取第一数据交互方基于所述ProtoBuf协议生成的proto文件;其中,所述proto文件包括用于构建ProtoBuf消息的消息格式;动态生成用于对基于所述消息格式构建的ProtoBuf消息进行解析的源代码,并对所述源代码执行代码编译生成对应的可执行代码;获取第一数据交互方基于所述消息格式构建的ProtoBuf消息,并执行所述可执行代码对所述ProtoBuf消息进行解析,得到与所述ProtoBuf消息对应的ProtoBuf对象。
Description
技术领域
本公开涉及计算机技术领域,尤其涉及一种基于ProtoBuf协议的消息解析方法及装置。
背景技术
ProtoBuf(Protocol Buffers的简称),是一种语言无关、平台无关、可扩展的序列化结构数据的方法;其中,序列化,是指将结构数据或对象转换成能够被存储和传输(例如网络传输)的格式,同时应当要保证这个序列化结果在之后(可能在另一个计算环境中)能够被重建回原来的结构数据或对象。由于ProtoBuf相比XML(Extensible MarkupLanguage,可扩展标记语言)、JSON(JavaScript Object Notation,JavaScript ObjectNotation,JS对象简谱)具有消息体积小、解析速度快的优势,因此,常被用于多个系统或服务之间进行数据交换的场景。
在相关技术中,基于ProtoBuf进行数据交换时,ProtoBuf消息通常被第一数据交互方执行序列化后转化为二进制数据,然后由第二数据交互方基于ProtoBuf动态解析机制对该二进制数据执行反序列化得到ProtoBuf消息。
例如,在实现时,第一数据交互方编写proto文件并生成对应的Descriptor对象,将Descriptor对象存储到第三方服务中;第二数据交互方从第三方服务获取Descriptor对象,基于Descriptor对象构建DynamicMessage对象;
通过DynamicMessage对象的函数来获取该二进制数据对应的ProtoBuf消息的各个字段,比如:通过DynamicMessage.getDescriptorForType().findFieldByName()函数获得各个字段对应的FieldDescriptor对象,再通过DynamicMessage.getField()方法获取各个字段对应的值。
然而,在实际应用中,通过DynamicMessage虽然可以动态解析ProtoBuf消息,但是在解析过程中存在较多条件判断、循环、字符串拼接等操作,而此类操作占用较高的CPU和内存,尤其伴随第一数据交互方与第二数据交互方之间数据交换流量的升高,将加剧了CPU和内存的占用,从而降低了ProtoBuf消息反序列化的解析效率。另外,由于第三方服务需要维护Descriptor对象的生成与更新,增加系统间的耦合度,降低了系统的鲁棒性。
发明内容
本公开提供一种基于ProtoBuf协议的消息解析方法及装置。用以至少解决相关技术中基于DynamicMessage进行ProtoBuf消息反序列解析效率低及系统鲁棒性差的问题。本公开的技术方案如下:
根据本公开实施例的第一方面,提供一种基于ProtoBuf协议的消息解析方法,包括:
获取第一数据交互方基于所述ProtoBuf协议生成的proto文件;其中,所述proto文件包括用于构建ProtoBuf消息的消息格式;
动态生成用于对基于所述消息格式构建的ProtoBuf消息进行解析的源代码,并对所述源代码执行代码编译生成对应的可执行代码;
获取第一数据交互方基于所述消息格式构建的ProtoBuf消息,并执行所述可执行代码对所述ProtoBuf消息进行解析,得到与所述ProtoBuf消息对应的ProtoBuf对象。
可选的,所述proto文件由第一数据交互方提交至第三方服务中存储;
所述获取第一数据交互方基于所述ProtoBuf协议生成的proto文件,包括:
从第三方服务获取所述proto文件。
可选的,所述动态生成用于对基于所述消息格式构建的ProtoBuf消息进行解析的源代码,包括:
确定由第一数据交互方生成的用于对所述消息格式进行解析的消息类;
动态生成用于调用所述消息类的源代码。
可选的,所述动态生成用于调用所述消息类的源代码,包括:
基于所述消息类的类名,动态生成用于调用所述消息类的源代码。
可选的,所述确定由第一数据交互方生成的用于对所述消息格式进行解析的消息类,包括:
确定所述消息类的类名;
基于所述类名确定与所述消息类对应的jar文件,并将所述jar文件拷贝至第二数据交互方的本地系统目录,以用于所述源代码的代码编译。
可选的,所述proto文件包括与所述消息类对应的类名;
所述确定所述消息类的类名,包括
对所述proto文件进行解析,得到所述消息类的类名。
可选的,所述对所述源代码执行代码编译生成对应的可执行代码,包括:
基于预设的运行时的嵌入式编译器,对所述源代码执行动态代码编译生成对应的可执行代码。
可选的,所述运行时的嵌入式编译器包括janino。
可选的,所述可执行代码为基于所述源代码编译生成的可执行的Java类;
所述执行所述可执行代码对所述ProtoBuf消息进行解析,得到与所述ProtoBuf消息对应的ProtoBuf对象,包括:
执行所述Java类对所述ProtoBuf消息执行解析,得到与ProtoBuf消息对应的ProtoBuf对象。
可选的,所述Java类包括用于解析ProtoBuf对象字段的字段解析函数;
所述执行所述Java类对所述ProtoBuf消息执行解析,得到与ProtoBuf消息对应的ProtoBuf对象,包括:
执行所述字段解析函数对所述ProtoBuf消息执行字段解析,得到与ProtoBuf消息对应的ProtoBuf对象字段,以完成对所述ProtoBuf消息的反序列化。
可选的,所述ProtoBuf消息为基于所述消息格式生成的字节数组形式的二进制数据。
根据本公开实施例的第二方面,提供一种基于ProtoBuf协议的消息解析装置,包括:
获取模块,被配置为执行获取第一数据交互方基于所述ProtoBuf协议生成的proto文件;其中,所述proto文件包括用于构建ProtoBuf消息的消息格式;
生成模块,被配置为执行动态生成用于对基于所述消息格式构建的ProtoBuf消息进行解析的源代码,并对所述源代码执行代码编译生成对应的可执行代码;
解析模块,被配置为执行获取第一数据交互方基于所述消息格式构建的ProtoBuf消息,并执行所述可执行代码对所述ProtoBuf消息进行解析,得到与所述ProtoBuf消息对应的ProtoBuf对象。
可选的,所述proto文件由第一数据交互方提交至第三方服务中存储;
所述获取第一数据交互方基于所述ProtoBuf协议生成的proto文件,包括:
从第三方服务获取所述proto文件。
可选的,所述动态生成用于对基于所述消息格式构建的ProtoBuf消息进行解析的源代码,包括:
确定由第一数据交互方生成的用于对所述消息格式进行解析的消息类;
动态生成用于调用所述消息类的源代码。
可选的,所述动态生成用于调用所述消息类的源代码,包括:
基于所述消息类的类名,动态生成用于调用所述消息类的源代码。
可选的,所述确定由第一数据交互方生成的用于对所述消息格式进行解析的消息类,包括:
确定所述消息类的类名;
基于所述类名确定与所述消息类对应的jar文件,并将所述jar文件拷贝至第二数据交互方的本地系统目录,以用于所述源代码的代码编译。
可选的,所述proto文件包括与所述消息类对应的类名;
所述确定所述消息类的类名,包括
对所述proto文件进行解析,得到所述消息类的类名。
可选的,所述对所述源代码执行代码编译生成对应的可执行代码,包括:
基于预设的运行时的嵌入式编译器,对所述源代码执行动态代码编译生成对应的可执行代码。
可选的,所述运行时的嵌入式编译器包括janino。
可选的,所述可执行代码为基于所述源代码编译生成的可执行的Java类;
所述执行所述可执行代码对所述ProtoBuf消息进行解析,得到与所述ProtoBuf消息对应的ProtoBuf对象,包括:
执行所述Java类对所述ProtoBuf消息执行解析,得到与ProtoBuf消息对应的ProtoBuf对象。
可选的,所述Java类包括用于解析ProtoBuf对象字段的字段解析函数;
所述执行所述Java类对所述ProtoBuf消息执行解析,得到与ProtoBuf消息对应的ProtoBuf对象,包括:
执行所述字段解析函数对所述ProtoBuf消息执行字段解析,得到与ProtoBuf消息对应的ProtoBuf对象字段,以完成对所述ProtoBuf消息的反序列化。
可选的,所述ProtoBuf消息为基于所述消息格式生成的字节数组形式的二进制数据。
根据本公开实施例的第三方面,提供一种基于ProtoBuf协议的消息解析电子设备,包括:
处理器;
用于存储所述处理器可执行指令的存储器;
其中,所述处理器被配置为执行所述指令,以实现前述任一项所述的基于ProtoBuf协议的消息解析方法。
根据本公开实施例的第四方面,提供一种计算机可读存储介质,当所述计算机可读存储介质中的指令由基于ProtoBuf协议的消息解析电子设备的处理器执行时,使得基于ProtoBuf协议的消息解析电子设备能够执行前述任一项所述的基于ProtoBuf协议的消息解析方法。
根据本公开实施例的第五方面,提供一种计算机程序产品,包括计算机程序或指令,所述计算机程序或指令被处理器执行时实现前述任一项所述的基于ProtoBuf协议的消息解析方法。
本公开的实施例提供的技术方案至少带来以下有益效果:
通过动态生成用于对ProtoBuf消息进行解析的源代码并对其执行代码编译生成对应的可执行代码,以及基于该可执行解析ProtoBuf消息。由于引用动态代码生成技术,避免基于DynamicMessage解析ProtoBuf消息时存在的较多条件判断、循环、字符串拼接等操作,因此,极大地降低了CPU和内存的占用,提高了ProtoBuf消息反序列化的解析效率。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理,并不构成对本公开的不当限定。
图1是根据一示例性实施例示出的一种基于ProtoBuf协议的消息解析方法的流程图。
图2是根据一示例性实施例示出的一种基于ProtoBuf协议的消息解析的信令交互示意图。
图3是根据一示例性实施例示出的一种基于ProtoBuf协议的消息解析装置的框图。
具体实施方式
为了使本领域普通人员更好地理解本公开的技术方案,下面将结合附图,对本公开实施例中的技术方案进行清楚、完整地描述。
需要说明的是,本公开的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本公开的实施例能够以除了在这里图示或描述的那些以外的顺序实施。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。
图1是根据一示例性实施例示出的一种基于ProtoBuf协议的消息解析方法的流程图,上述方法可以应用于第二数据交互方,包括以下步骤:
步骤110,获取第一数据交互方基于上述ProtoBuf协议生成的proto文件;其中,上述proto文件包括用于构建ProtoBuf消息的消息格式。
步骤120,动态生成用于对基于上述消息格式构建的ProtoBuf消息进行解析的源代码,并对上述源代码执行代码编译生成对应的可执行代码。
步骤130,获取第一数据交互方基于上述消息格式构建的ProtoBuf消息,并执行上述可执行代码对上述ProtoBuf消息进行解析,得到与上述ProtoBuf消息对应的ProtoBuf对象。
在本说明书中,上述第一数据交互方,是指基于ProtoBuf协议进行数据交换的生成ProtoBuf消息的生成方;在有的示例中,会将上述第一数据交互方称为生产方。
上述第二数据交互方,是指基于ProtoBuf协议进行数据交换的获取来自上述第一数据交互方生成的ProtoBuf消息的使用方;在有的示例中,会将上述第二数据交互方称为消费方。
其中,上述第一数据交互方及上述第二数据交互方的具体运行方式,不作具体限定。例如,在实际应用中,上述第一数据交互方及上述第二数据交互方可以作为进程、服务、模块、系统等方式运行。
上述第一数据交互方与上述第二数据交互方之间,可以通过消息队列进行ProtoBuf消息的发送和获取;其中,消息队列的类型在本说明书中不作具体限定。比如:消息队列具体可以包括RabbitMQ、Kafka等。
当然,在实际应用中,上述第一数据交互方与上述第二数据交互方也可以直接相连通信进行ProtoBuf消息的发送和获取。
在本说明书中,上述proto文件由上述第一数据交互方生成;上述proto文件包括用于构建ProtoBuf消息的消息格式。
其中,上述消息格式具体是指proto文件中包括的基于message关键字定义的ProtoBuf消息对应的数据结构。
上述proto文件的具体组成,以及基于message关键字定义的与ProtoBuf消息对应的消息格式的具体格式,请参见ProtoBuf协议中proto文件的详细说明,这里不再赘述。
在本说明书中,上述第二数据交互方获取上述第一数据交互方基于ProtoBuf协议生成的proto文件。
在示出的一种实施方式中,上述proto文件由上述第一数据交互方提交至第三方服务中存储,在获取上述proto文件过程中,上述第二数据交互方可以从上述第三方服务获取上述proto文件。
在本说明书中,上述第二数据交互方可以动态生成用于对基于上述消息格式构建的ProtoBuf消息进行解析的源代码。
在示出的一种实施方式中,在动态生成用于对基于上述消息格式构建的ProtoBuf消息进行解析的源代码的过程中,上述第二数据交互方可以先确定由上述第一数据交互方生成的用于对上述消息格式进行解析的消息类;再动态生成用于调用上述消息类的源代码。
其中,上述消息类,是指与上述proto文件中定义的基于message关键字定义的消息格式对应的消息类。
例如,假设proto文件中定义的基于message关键字定义的消息格式为Student,则与Student对应的消息类可以为ProtoSample.Student(消息类的类名)。
在示出的一种实施方式中,在确定上述消息类的过程中,上述第二数据交互方可以先确定上述消息类的类名;再基于上述类名确定与上述消息类对应的jar文件,并将上述jar文件拷贝至第二数据交互方的本地系统目录,以用于上述源代码的代码编译。
例如,以消息类的类名是ProtoSample.Student为例,第二数据交互方可以先确定该消息类的类名:ProtoSample.Student;再基于该类名确定与该消息类对应的jar文件,并将jar文件拷贝至第二数据交互方的本地系统目录(比如:以第二数据交互方为java进程为例,该本地系统目录具体可以包括该java进程所在的classpath环境变量所指示的路径),以用于源代码的代码编译。
需要说明的是,在实际应用中,与上述消息类对应的jar文件,可以由上述第一数据交互方预先生成并被提交至上述第三方服务中存储,并由上述第二数据交互方从上述第三方服务中获取至本地。
在示出的一种实施方式中,在动态生成用于调用上述消息类的源代码的过程中,上述第二数据交互方可以基于上述消息类的类名,动态生成用于调用上述消息类的源代码。
例如,以消息类的类名是ProtoSample.Student为例,在动态生成用于调用该消息类的源代码的过程中,第二数据交互方可以基于该消息类的类名:ProtoSample.Student,动态生成用于调用该消息类的源代码,该源代码比如具体包括以下:
ProtoSample.Student student1=ProtoSample.Student.parseFrom(data);
其中,data为第二数据交互方获取的第一数据交互方基于proto文件中定义的student消息格式构建的ProtoBuf消息进行序列化之后生成的字节数组形式的二进制数据。
在示出的一种实施方式中,上述proto文件包括与上述消息类对应的类名,在确定上述消息类的类名的过程中,上述第二数据交互方对上述proto文件进行解析,得到上述消息类的类名。
在本说明书中,在动态生成上述源代码后,上述第二数据交互方可以对上述源代码执行代码编译生成对应的可执行代码。
例如,以前文示例的动态生成的源代码为java源代码为例,第二数据交互方可以对该源代码执行代码编译生成对应的可执行代码。
在示出的一种实施方式中,在对上述源代码执行代码编译生成对应的可执行代码的过程中,上述第二数据交互方可以基于预设的运行时的嵌入式编译器,对上述源代码执行动态代码编译生成对应的可执行代码。
例如,以上述源代码为java源代码为例,上述运行时的嵌入式编译器可以包括janino
其中,通过调用janino针对动态生成的java源代码执行动态代码编译,不仅能像Javac那样将一组源文件编译成字节码文件,还可以对一些Java表达式,代码块,类中的文本(class body)或者内存中源文件进行编译,并把编译后的字节码直接加载到与之前运行的可执行代码所在同一个JVM中运行,与Javac相比在编译效率和可执行代码的执行性能上都有较大提升。
在本说明书中,在对上述源代码执行代码编译生成对应的可执行代码后,上述第二数据交互方获取上述第一数据交互方基于上述消息格式构建的ProtoBuf消息;
其中,上述ProtoBuf消息为基于上述消息格式生成的字节数组形式的二进制数据。
例如,以消息格式是Student为例,第二数据交互方可以从消息队列获取第一数据交互方基于Student生成对应的ProtoBuf消息,ProtoBuf消息通过调用ToByteArray()转换为字节数组形式的二进制数据(也即,前文示例的data),该过程也常被简称为序列化。
在本说明书中,进一步地,上述第二数据交互方执行上述可执行代码对上述ProtoBuf消息进行解析,得到与上述ProtoBuf消息对应的ProtoBuf对象。
在示出的一种实施方式中,上述可执行代码为基于上述源代码编译生成的可执行的Java类,在对上述源代码执行代码编译生成对应的可执行代码的过程中,上述第二数据交互方执行上述Java类对上述ProtoBuf消息执行解析,得到与上述ProtoBuf消息对应的ProtoBuf对象。
例如,第二数据交互方执行Java类对二进制数据data(已序列化的ProtoBuf消息)执行解析,得到与该ProtoBuf消息对应的ProtoBuf对象。
在示出的一种实施方式中,上述Java类包括用于解析ProtoBuf对象字段的字段解析函数,在执行上述Java类对上述ProtoBuf消息执行解析,得到与上述ProtoBuf消息对应的ProtoBuf对象的过程中,上述第二数据交互方通过执行上述字段解析函数对上述ProtoBuf消息执行字段解析,得到与ProtoBuf消息对应的ProtoBuf对象字段,以完成对上述ProtoBuf消息的反序列化。
例如,第二数据交互方通过执行字段解析函数对已序列化后的ProtoBuf消息(二进制数据data)执行字段解析,得到与ProtoBuf消息对应的ProtoBuf对象字段(比如:得到ProtoBuf消息按student消息格式定义的各个消息字段),以完成对已序列化后的ProtoBuf消息的反序列化。
需要说明的是,在实际应用中,在对ProtoBuf消息执行消息字段的反序列化解析时,ProtoBuf对象可以包括一个或多个消息字段(具体和上述消息格式的定义相关),伴随消息格式中包括消息字段数目的增多,上述实施例与DynamicMessage动态解析相比CPU和内存占用也越少,也即,反序列化字段越多,性能提升效果越明显。
为了方便整体理解,请参考图2,图2是根据一示例性实施例示出的一种基于ProtoBuf协议的消息解析的信令交互示意图。
如图2所示,生产方与消费方通过消息队列及第三方服务进行互联通信,基于ProtoBuf协议的消息解析的信令交互,主要包括以下步骤:
S201.生产方生成包含消息格式的proto文件和包含消息类的jar文件。
S202.生产方将proto文件和jar文件提交至第三方服务中进行保存。
S203.消费方从第三方服务中获取proto文件。
S204.消费方解析proto文件得到消息类的类名。
S205.消费方基于消息类的类名,从第三方服务中获取jar文件并保存在消费方的本地系统目录,用于代码编译。
S206.消费方基于消息类动态生成用于对基于消息格式构建的ProtoBuf消息进行解析的源代码。
S207.消费方基于janino对该源代码执行动态代码编译生成对应的可执行的Java类。
S208.生产方基于消息格式生成Probuf消息,并将其提交至消息队列。
S209.消费方从消息队列获取Probuf消息,并基于可执行的Java类,对Probuf消息得到消息格式的字段,以完成反序列化。
综上,通过上述实施例,通过动态生成用于对ProtoBuf消息进行解析的源代码并对其执行代码编译生成对应的可执行代码,以及基于该可执行解析ProtoBuf消息。由于引用动态代码生成技术,避免基于DynamicMessage解析ProtoBuf消息时存在的较多条件判断、循环、字符串拼接等操作,因此,极大地降低了CPU和内存的占用,提高了ProtoBuf消息反序列化的解析效率。
图3是与前述图1对应的一种基于ProtoBuf协议的消息解析装置框图。参照图3,该装置包括获取模块310、生成模块320、解析模块330。
获取模块310,被配置为执行获取第一数据交互方基于所述ProtoBuf协议生成的proto文件;其中,所述proto文件包括用于构建ProtoBuf消息的消息格式;
生成模块320,被配置为执行动态生成用于对基于所述消息格式构建的ProtoBuf消息进行解析的源代码,并对所述源代码执行代码编译生成对应的可执行代码;
解析模块330,被配置为执行获取第一数据交互方基于所述消息格式构建的ProtoBuf消息,并执行所述可执行代码对所述ProtoBuf消息进行解析,得到与所述ProtoBuf消息对应的ProtoBuf对象。
可选的,所述proto文件由第一数据交互方提交至第三方服务中存储;
所述获取第一数据交互方基于所述ProtoBuf协议生成的proto文件,包括:
从第三方服务获取所述proto文件。
可选的,所述动态生成用于对基于所述消息格式构建的ProtoBuf消息进行解析的源代码,包括:
确定由第一数据交互方生成的用于对所述消息格式进行解析的消息类;
动态生成用于调用所述消息类的源代码。
可选的,所述动态生成用于调用所述消息类的源代码,包括:
基于所述消息类的类名,动态生成用于调用所述消息类的源代码。
可选的,所述确定由第一数据交互方生成的用于对所述消息格式进行解析的消息类,包括:
确定所述消息类的类名;
基于所述类名确定与所述消息类对应的jar文件,并将所述jar文件拷贝至第二数据交互方的本地系统目录,以用于所述源代码的代码编译。
可选的,所述proto文件包括与所述消息类对应的类名;
所述确定所述消息类的类名,包括
对所述proto文件进行解析,得到所述消息类的类名。
可选的,所述对所述源代码执行代码编译生成对应的可执行代码,包括:
基于预设的运行时的嵌入式编译器,对所述源代码执行动态代码编译生成对应的可执行代码。
可选的,所述运行时的嵌入式编译器包括janino。
可选的,所述可执行代码为基于所述源代码编译生成的可执行的Java类;
所述执行所述可执行代码对所述ProtoBuf消息进行解析,得到与所述ProtoBuf消息对应的ProtoBuf对象,包括:
执行所述Java类对所述ProtoBuf消息执行解析,得到与ProtoBuf消息对应的ProtoBuf对象。
可选的,所述Java类包括用于解析ProtoBuf对象字段的字段解析函数;
所述执行所述Java类对所述ProtoBuf消息执行解析,得到与ProtoBuf消息对应的ProtoBuf对象,包括:
执行所述字段解析函数对所述ProtoBuf消息执行字段解析,得到与ProtoBuf消息对应的ProtoBuf对象字段,以完成对所述ProtoBuf消息的反序列化。
可选的,所述ProtoBuf消息为基于所述消息格式生成的字节数组形式的二进制数据。
关于上述实施例中的装置,其中各个模块执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
在示例性实施例中,还提供了一种基于ProtoBuf协议的消息解析电子设备,包括处理器;用于存储所述处理器可执行指令的存储器;其中,所述处理器被配置为执行所述指令,以完成上述方法。
在示例性实施例中,还提供了一种包括指令的计算机可读存储介质,例如包括指令的存储器,上述指令可由装置的处理器执行以完成上述方法。可选地,计算机可读存储介质可以是ROM、随机存取存储器(RAM)、CD-ROM、磁带、软盘和光数据存储设备等。
在示例性实施例中,还提供一种计算机程序产品,包括计算机程序/指令,所述计算机程序或指令被处理器执行时完成上述方法。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本公开旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。
应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。
Claims (10)
1.一种基于ProtoBuf协议的消息解析方法,其特征在于,包括:
获取第一数据交互方基于所述ProtoBuf协议生成的proto文件;其中,所述proto文件包括用于构建ProtoBuf消息的消息格式;
动态生成用于对基于所述消息格式构建的ProtoBuf消息进行解析的源代码,并对所述源代码执行代码编译生成对应的可执行代码;
获取第一数据交互方基于所述消息格式构建的ProtoBuf消息,并执行所述可执行代码对所述ProtoBuf消息进行解析,得到与所述ProtoBuf消息对应的ProtoBuf对象。
2.根据权利要求1所述的方法,其特征在于,所述proto文件由第一数据交互方提交至第三方服务中存储;
所述获取第一数据交互方基于所述ProtoBuf协议生成的proto文件,包括:
从第三方服务获取所述proto文件。
3.根据权利要求1所述的方法,其特征在于,所述动态生成用于对基于所述消息格式构建的ProtoBuf消息进行解析的源代码,包括:
确定由第一数据交互方生成的用于对所述消息格式进行解析的消息类;
动态生成用于调用所述消息类的源代码。
4.根据权利要求3所述的方法,其特征在于,所述动态生成用于调用所述消息类的源代码,包括:
基于所述消息类的类名,动态生成用于调用所述消息类的源代码。
5.根据权利要求3所述的方法,其特征在于,所述确定由第一数据交互方生成的用于对所述消息格式进行解析的消息类,包括:
确定所述消息类的类名;
基于所述类名确定与所述消息类对应的jar文件,并将所述jar文件拷贝至第二数据交互方的本地系统目录,以用于所述源代码的代码编译。
6.根据权利要求5所述的方法,其特征在于,所述proto文件包括与所述消息类对应的类名;
所述确定所述消息类的类名,包括
对所述proto文件进行解析,得到所述消息类的类名。
7.一种基于ProtoBuf协议的消息解析装置,其特征在于,包括:
获取模块,被配置为执行获取第一数据交互方基于所述ProtoBuf协议生成的proto文件;其中,所述proto文件包括用于构建ProtoBuf消息的消息格式;
生成模块,被配置为执行动态生成用于对基于所述消息格式构建的ProtoBuf消息进行解析的源代码,并对所述源代码执行代码编译生成对应的可执行代码;
解析模块,被配置为执行获取第一数据交互方基于所述消息格式构建的ProtoBuf消息,并执行所述可执行代码对所述ProtoBuf消息进行解析,得到与所述ProtoBuf消息对应的ProtoBuf对象。
8.一种基于ProtoBuf协议的消息解析电子设备,其特征在于,包括:
处理器;
用于存储所述处理器可执行指令的存储器;
其中,所述处理器被配置为执行所述可执行指令,以实现如权利要求1-6中任一项所述的基于ProtoBuf协议的消息解析方法。
9.一种计算机可读存储介质,其特征在于,当所述计算机可读存储介质中的指令由基于ProtoBuf协议的消息解析电子设备的处理器执行时,使得基于ProtoBuf协议的消息解析电子设备能够执行如权利要求1-6中任一项所述的基于ProtoBuf协议的消息解析方法。
10.一种计算机程序产品,包括计算机程序或指令,其特征在于,所述计算机程序或指令被处理器执行时实现权利要求1-6中任一项所述的基于ProtoBuf协议的消息解析方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110713455.8A CN113434147B (zh) | 2021-06-25 | 2021-06-25 | 基于ProtoBuf协议的消息解析方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110713455.8A CN113434147B (zh) | 2021-06-25 | 2021-06-25 | 基于ProtoBuf协议的消息解析方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113434147A true CN113434147A (zh) | 2021-09-24 |
CN113434147B CN113434147B (zh) | 2024-05-14 |
Family
ID=77754651
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110713455.8A Active CN113434147B (zh) | 2021-06-25 | 2021-06-25 | 基于ProtoBuf协议的消息解析方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113434147B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114268620A (zh) * | 2021-12-13 | 2022-04-01 | 深圳供电局有限公司 | 一种用于物联网智能设备的数据压缩传输方法 |
CN115314536A (zh) * | 2022-08-03 | 2022-11-08 | 平安付科技服务有限公司 | 远程执行命令方法及装置、存储介质、计算机设备 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2015078248A1 (en) * | 2013-11-26 | 2015-06-04 | Tencent Technology (Shenzhen) Company Limited | Dynamic code instrumentation |
CN107025105A (zh) * | 2016-09-23 | 2017-08-08 | 阿里巴巴集团控股有限公司 | 代码生成方法及装置 |
CN107861723A (zh) * | 2017-10-25 | 2018-03-30 | 深圳市华成峰科技有限公司 | 海量数据处理方法及其系统 |
CN110941655A (zh) * | 2018-09-21 | 2020-03-31 | 中移(杭州)信息技术有限公司 | 一种数据格式转换方法及装置 |
-
2021
- 2021-06-25 CN CN202110713455.8A patent/CN113434147B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2015078248A1 (en) * | 2013-11-26 | 2015-06-04 | Tencent Technology (Shenzhen) Company Limited | Dynamic code instrumentation |
CN107025105A (zh) * | 2016-09-23 | 2017-08-08 | 阿里巴巴集团控股有限公司 | 代码生成方法及装置 |
CN107861723A (zh) * | 2017-10-25 | 2018-03-30 | 深圳市华成峰科技有限公司 | 海量数据处理方法及其系统 |
CN110941655A (zh) * | 2018-09-21 | 2020-03-31 | 中移(杭州)信息技术有限公司 | 一种数据格式转换方法及装置 |
Non-Patent Citations (2)
Title |
---|
严忠林: "使用代码动态生成技术提升Java程序灵活性", 《计算机时代》, no. 5, pages 7 - 9 * |
王少林 等: "基于 Protocol Buffers的航天测控数据交换模式研究", 《遥测遥控》, vol. 33, no. 4, pages 55 - 60 * |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114268620A (zh) * | 2021-12-13 | 2022-04-01 | 深圳供电局有限公司 | 一种用于物联网智能设备的数据压缩传输方法 |
CN115314536A (zh) * | 2022-08-03 | 2022-11-08 | 平安付科技服务有限公司 | 远程执行命令方法及装置、存储介质、计算机设备 |
CN115314536B (zh) * | 2022-08-03 | 2024-02-02 | 平安付科技服务有限公司 | 远程执行命令方法及装置、存储介质、计算机设备 |
Also Published As
Publication number | Publication date |
---|---|
CN113434147B (zh) | 2024-05-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110704063B (zh) | 编译和执行智能合约的方法及装置 | |
US6263485B1 (en) | Method and apparatus for describing an interface definition language-defined interface, operation, and data type | |
CN110704064B (zh) | 编译和执行智能合约的方法及装置 | |
CN113434147B (zh) | 基于ProtoBuf协议的消息解析方法及装置 | |
CN110688122A (zh) | 编译和执行智能合约的方法及装置 | |
US5943674A (en) | Data structure representing an interface definition language source file | |
CN110688096B (zh) | 包含插件的应用程序的构建方法、装置、介质及电子设备 | |
CN110928545B (zh) | 组件分发方法、单页应用的开发方法、装置及存储介质 | |
CN110941655B (zh) | 一种数据格式转换方法及装置 | |
CN111913741B (zh) | 对象拦截方法、装置、介质及电子设备 | |
CN110633162B (zh) | 远程调用实现方法、装置、计算机设备及存储介质 | |
CN113626071B (zh) | 函数注册方法、系统、电子设备及存储介质 | |
CN115061678A (zh) | 一种基于浏览器代理服务的代码编译方法及客户端 | |
CN112905170A (zh) | 渠道包的生成方法、装置、设备及存储介质 | |
CN113032468A (zh) | 数据写入方法、装置和计算机可读存储介质 | |
CN113342633B (zh) | 一种性能测试方法和装置 | |
CN115086441B (zh) | 信息传输方法、装置、电子设备及存储介质 | |
EP3872630B1 (en) | Request processing method and apparatus, electronic device, and computer storage medium | |
CN117118962B (zh) | 用于跨多个云平台部署用户方法的方法和系统 | |
CN111142860B (zh) | 用于实现接口调用的方法及装置 | |
CN113900631A (zh) | 一种基于antlr4的代码生成器设计方法 | |
CN115114890A (zh) | 数据解析方法及装置、电子设备及可读介质 | |
CN116483366A (zh) | 业务数据的传输方法和装置、存储介质及电子设备 | |
CN107070964B (zh) | 基于异构环境的远程通信打包方法及系统 | |
CN115878120A (zh) | 代码生成方法、装置及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant |