CN110597500B - 消息结构的序列化和反序列化方法及装置 - Google Patents

消息结构的序列化和反序列化方法及装置 Download PDF

Info

Publication number
CN110597500B
CN110597500B CN201910682876.1A CN201910682876A CN110597500B CN 110597500 B CN110597500 B CN 110597500B CN 201910682876 A CN201910682876 A CN 201910682876A CN 110597500 B CN110597500 B CN 110597500B
Authority
CN
China
Prior art keywords
message structure
code
serialization
byte stream
programming language
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.)
Active
Application number
CN201910682876.1A
Other languages
English (en)
Other versions
CN110597500A (zh
Inventor
高翅
苏光荣
韩英洁
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Microfun Inc
Original Assignee
Microfun Inc
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Microfun Inc filed Critical Microfun Inc
Priority to CN201910682876.1A priority Critical patent/CN110597500B/zh
Priority to US16/695,478 priority patent/US11044140B2/en
Publication of CN110597500A publication Critical patent/CN110597500A/zh
Application granted granted Critical
Publication of CN110597500B publication Critical patent/CN110597500B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L67/00Network arrangements or protocols for supporting network services or applications
    • H04L67/01Protocols
    • H04L67/02Protocols based on web technology, e.g. hypertext transfer protocol [HTTP]
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L41/00Arrangements for maintenance, administration or management of data switching networks, e.g. of packet switching networks
    • H04L41/02Standardisation; Integration
    • H04L41/0246Exchanging or transporting network management information using the Internet; Embedding network management web servers in network elements; Web-services-based protocols
    • H04L41/0266Exchanging or transporting network management information using the Internet; Embedding network management web servers in network elements; Web-services-based protocols using meta-data, objects or commands for formatting management information, e.g. using eXtensible markup language [XML]
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/95Retrieval from the web
    • G06F16/958Organisation or management of web site content, e.g. publishing, maintaining pages or automatic linking
    • G06F16/986Document structures and storage, e.g. HTML extensions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L67/00Network arrangements or protocols for supporting network services or applications
    • H04L67/01Protocols
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L67/00Network arrangements or protocols for supporting network services or applications
    • H04L67/50Network services
    • H04L67/56Provisioning of proxy services
    • H04L67/565Conversion or adaptation of application format or content
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L67/00Network arrangements or protocols for supporting network services or applications
    • H04L67/50Network services
    • H04L67/56Provisioning of proxy services
    • H04L67/565Conversion or adaptation of application format or content
    • H04L67/5651Reducing the amount or size of exchanged application data

Landscapes

  • Engineering & Computer Science (AREA)
  • Signal Processing (AREA)
  • Computer Networks & Wireless Communication (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Databases & Information Systems (AREA)
  • General Physics & Mathematics (AREA)
  • Physics & Mathematics (AREA)
  • Data Mining & Analysis (AREA)
  • Computing Systems (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Information Transfer Between Computers (AREA)

Abstract

本发明实施例提供一种消息结构的序列化和反序列化方法及装置,该序列化方法包括:获取消息结构,对所述消息结构进行预处理,生成对应的目标版本号,其中,内容不同的消息结构对应的版本号各不相同,所述消息结构为服务器向客户端传送的状态信息的结构;对待发送信息进行序列化处理,得到对应的字节流,所述待发送信息中携带所述状态信息的数据和所述目标版本号;向客户端发送所述字节流。本发明实施例提供的一种消息结构的序列化和反序列化方法及装置,具有良好的版本控制,能够避免序列化和反序列化的版本不一致导致程序运行出错的问题。

Description

消息结构的序列化和反序列化方法及装置
技术领域
本发明实施例涉及计算机技术领域,尤其涉及一种消息结构的序列化和反序列化方法及装置。
背景技术
序列化是将对象的状态信息转换为可以存储或传输的形式的过程,一般是转换为字节流。与之相对的是反序列化过程,将字节流重新构建为对象。通过序列化能够将对象从一个位置传输到另一个位置,使程序更具维护性,也能够将对象存储起来,使自定义对象持久化。
客户端与服务器通过网络传递结构化数据时,为了使得网络上传输的数据不依赖于开发语言以及平台,或者是为了减少网络传输的流量,往往会使用序列化的方案进行传输。现有的序列化和反序列化的方法一般是基于Google Protocol Buffer的混合语言数据标准,使用.proto文件定义序列化格式,能够将.proto文件编译成C++、Java、Python等语言的源代码,也就是将.proto文件中定义的消息映射为编程语言中的相应的数据结构。
现有序列化和反序列化的方法,在序列化和反序列化的过程中,一般是采用程序开发人员维护程序版本的方式,对于不同的对象定义可能分配到相同的版本号。在客户端和服务器端对对象的定义不一致时,容易出现序列化和反序列化的版本不一致导致程序运行出错的问题。
发明内容
本发明实施例为解决上述问题,提供一种消息结构的序列化和反序列化方法及装置。
第一方面,本发明实施例提供一种消息结构的序列化方法,包括:
获取消息结构,对所述消息结构进行预处理,生成对应的目标版本号,其中,内容不同的消息结构对应的版本号各不相同,所述消息结构为服务器向客户端传送的状态信息的结构;
对待发送信息进行序列化处理,得到对应的字节流,所述待发送信息中携带所述状态信息的数据和所述目标版本号;
向客户端发送所述字节流。
在一种可能的实现方式中,所述消息结构的格式为可扩展标记语言结构定义格式,所述对所述待发送信息进行序列化处理,得到对应的字节流,包括:
通过可扩展样式表转换语言对所述消息结构进行处理,得到多种编程语言下的代码,其中,每种所述编程语言下的代码包括第一代码和第二代码,所述第一代码为所述消息结构对应的数据结构代码,所述第二代码为序列化函数代码和反序列化函数代码;
根据第一编程语言下的序列化函数代码对所述待发送信息进行序列化处理,得到对应的字节流,其中,所述第一编程语言为所述多种编程语言中的一种。
在一种可能的实现方式中,所述获取消息结构,对所述消息结构进行预处理,生成对应的目标版本号,包括:
获取可扩展标记语言结构定义格式的消息结构;
对所述可扩展标记语言结构定义格式的消息结构进行标准化处理,得到处理后的消息结构,其中,所述标准化处理包括去除所述可扩展标记语言结构定义格式的消息结构中的注释和对所述可扩展标记语言结构定义格式的消息结构中的字段进行排序;
根据所述处理后的消息结构,得到所述目标版本号。
第二方面,本发明实施例提供一种消息结构的反序列化方法,包括:
获取服务器发送的字节流,所述字节流包括状态信息的数据和目标版本号,所述字节流是所述服务器对所述状态信息的数据和目标版本号进行序列化处理得到的;
根据所述目标版本号对所述字节流进行反序列化处理,得到对应的消息结构。
在一种可能的实现方式中,所述根据所述目标版本号对所述字节流进行反序列化处理,得到对应的消息结构,包括:
根据所述目标版本号获取多种编程语言下的代码,其中,每种所述编程语言下的代码包括第一代码和第二代码,所述第一代码为所述消息结构对应的数据结构代码,所述第二代码为序列化函数代码和反序列化函数代码,所述字节流是根据第一编程语言下的序列化函数代码对消息结构的数据进行序列化处理得到的,所述第一编程语言为所述多种编程语言中的一种;
通过第二编程语言下的反序列化函数代码将所述字节流进行反序列化处理,得到所述第二编程语言下的数据,其中,所述第二编程语言为所述多种编程语言中的一种;
通过所述第二编程语言下的第一代码和所述第二编程语言下的数据,得到所述第二编程语言下的消息结构。
在一种可能的实现方式中,所述根据所述目标版本号获取多种编程语言下的代码,包括:
根据所述目标版本号获取对应的可扩展标记语言结构定义格式的消息结构;
根据所述可扩展标记语言结构定义格式的消息结构获取所述多种编程语言下的第一代码和第二代码。
第三方面,本发明实施例提供一种消息结构的序列化装置,包括:
处理模块,用于获取消息结构,对所述消息结构进行预处理,生成对应的目标版本号,其中,内容不同的消息结构对应的版本号各不相同,所述消息结构为服务器向客户端传送的状态信息的结构;
序列化模块,用于对待发送信息进行序列化处理,得到对应的字节流,所述待发送信息中携带所述状态信息的数据和所述目标版本号;
发送模块,用于向客户端发送所述字节流。
在一种可能的实现方式中,所述消息结构的格式为可扩展标记语言结构定义格式,所述序列化模块具体用于:
通过可扩展样式表转换语言对所述消息结构进行处理,得到多种编程语言下的代码,其中,每种所述编程语言下的代码包括第一代码和第二代码,所述第一代码为所述消息结构对应的数据结构代码,所述第二代码为序列化函数代码和反序列化函数代码;
根据第一编程语言下的序列化函数代码对所述待发送信息进行序列化处理,得到对应的字节流,其中,所述第一编程语言为所述多种编程语言中的一种。
在一种可能的实现方式中,所述处理模块具体用于:
获取可扩展标记语言结构定义格式的消息结构;
对所述可扩展标记语言结构定义格式的消息结构进行标准化处理,得到处理后的消息结构,其中,所述标准化处理包括去除所述可扩展标记语言结构定义格式的消息结构中的注释和对所述可扩展标记语言结构定义格式的消息结构中的字段进行排序;
根据所述处理后的消息结构,得到所述目标版本号。
第四方面,本发明实施例提供一种消息结构的反序列化装置,包括:
获取模块,用于获取服务器发送的字节流,所述字节流包括状态信息的数据和目标版本号,所述字节流是所述服务器对所述状态信息的数据和目标版本号进行序列化处理得到的;
反序列化模块,用于根据所述目标版本号对所述字节流进行反序列化处理,得到对应的消息结构。
在一种可能的实现方式中,所述反序列化模块具体用于:
根据所述目标版本号获取多种编程语言下的代码,其中,每种所述编程语言下的代码包括第一代码和第二代码,所述第一代码为所述消息结构对应的数据结构代码,所述第二代码为序列化函数代码和反序列化函数代码,所述字节流是根据第一编程语言下的序列化函数代码对消息结构的数据进行序列化处理得到的,所述第一编程语言为所述多种编程语言中的一种;
通过第二编程语言下的反序列化函数代码将所述字节流进行反序列化处理,得到所述第二编程语言下的数据,其中,所述第二编程语言为所述多种编程语言中的一种;
通过所述第二编程语言下的第一代码和所述第二编程语言下的数据,得到所述第二编程语言下的消息结构。
在一种可能的实现方式中,所述反序列化模块具体用于:
根据所述目标版本号获取对应的可扩展标记语言结构定义格式的消息结构;
根据所述可扩展标记语言结构定义格式的消息结构获取所述多种编程语言下的第一代码和第二代码。
第五方面,本发明实施例提供一种消息结构的序列化和反序列化设备,包括:至少一个处理器和存储器;
所述存储器存储计算机执行指令;
所述至少一个处理器执行所述存储器存储的计算机执行指令,使得所述至少一个处理器执行如第一方面任一项所述的消息结构的序列化方法,或者,使得所述至少一个处理器执行如第二方面任一项所述的消息结构的反序列化方法。
第六方面,本发明实施例提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如第一方面任一项所述的消息结构的序列化方法,或者,实现如第二方面任一项所述的消息结构的反序列化方法。
本发明实施例提供的消息结构的序列化和反序列化方法及装置,首先服务器获取消息结构,并对消息结构进行预处理,生成对应的目标版本号,然后对待发送信息进行序列化处理,得到对应的字节流,发送给客户端,其中待发送信息中携带了目标版本号。客户端获取到字节流后,根据目标版本号对字节流进行反序列化处理,得到对应的消息结构。本发明实施例中,内容不同的消息结构对应的版本号各不相同,即目标版本号与消息结构的内容直接相关且唯一对应,因此本发明实施例提供的方法具有良好的版本控制,避免了不同的对象定义可能分配到相同的版本号的问题,保证了序列化和反序列化时对应的是相同版本号的协议,从而避免了序列化和反序列化的版本不一致导致程序运行出错的问题。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的消息结构的序列化和反序列化的应用场景示意图;
图2为本发明实施例提供的消息结构的序列化和反序列化方法的交互示意图;
图3为本发明又一实施例提供的消息结构的序列化和反序列化方法的交互示意图;
图4为本发明实施例提供的消息结构的序列化装置的结构示意图;
图5为本发明实施例提供的消息结构的反序列化装置的结构示意图;
图6为本发明实施例提供的消息结构的序列化和反序列化设备的硬件结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1为本发明实施例提供的消息结构的序列化和反序列化的应用场景示意图,如图1所示,包括服务器11和客户端12,服务器11和客户端12之间通过无线网络连接,服务器11和客户端12之间通过无线网络传递结构化数据时,为了使网络上传输的数据不依赖于开发语言以及平台,或是为了减少网络传输的流量,往往会使用序列化的方式进行传输。在需要对使用该结构化数据时,又可以通过反序列化的方式将其恢复出来。
序列化是指将结构化的数据按一定的编码规范转换成指定格式的过程,反序列化是指将转成指定格式的数据解析成原始的结构化数据的过程。例如,Person是一个表示人的对象类型,person是一个Person类型的对象,将存储在内存中的结构化的对象person转换为无结构的字节流的过程就是一种序列化,而对应的,将无结构的字节流反向转换成内存中结构化的对象person的过程,即为对应的反序列化。序列化的过程需要一定的序列化协议,例如XML、JavaScript对象简谱(JavaScript Object Notation,以下简称JSON)等。
图2为本发明实施例提供的消息结构的序列化和反序列化方法的交互示意图,如图2所示,包括:
S21,服务器获取消息结构,对所述消息结构进行预处理,生成对应的目标版本号。
现有序列化方案中,由于没有良好的应用程序版本控制,使得协议内容中不同的定义可能会分配到相同的版本号,从而导致测试阶段出现错误而不易发现。本发明实施例提供的方案,对于要传输的状态信息,首先获取其对应的消息结构,然后根据消息结构的预处理得到对应的目标版本号,其中,消息结构在内存中具体可以为一个对象,内容不同的消息结构对应的版本号各不相同,即版本号与消息结构的内容直接相关,通过版本号就能直接且唯一确定消息结构的内容,从而实现良好的应用程序版本控制,对于协议内容中不同的定义,分配的版本号一定不同。
S22,服务器对待发送消息进行序列化处理,得到对应的字节流。
得到目标版本号后,服务器对待发送的消息进行序列化处理,得到对应的字节流,其中,待发送消息中携带目标版本号,根据目标版本号能够获取到状态信息的结构,而对待发送信息进行序列化处理,是将状态信息的数据转换成对应的字节流的过程。
S23,服务器向客户端发送所述字节流。
S24,客户端接收服务器发送的字节流。
服务器将待发送信息进行序列化处理,得到字节流后,向客户端发送字节流,客户端接收该字节流,从而实现数据从服务器端到客户端之间的传输。
S25,客户端根据目标版本号对所述字节流进行反序列化处理,得到对应的消息结构。
反序列化是指将字节流恢复成对应的消息结构的过程。服务器通过对待发送信息中状态信息的数据进行序列化处理,得到字节流后,会向客户端发送字节流,客户端接收该字节流,同时,由于待发送信息中携带有目标版本号,因此客户端能够获取到该目标版本号,从而保证序列化之前和反序列化之后对应的版本协议相同。然后客户端根据该目标版本号对字节流进行反序列化处理,即可得到对应的消息结构。
本发明实施例提供的消息结构的序列化和反序列化方法,首先服务器获取消息结构,并对消息结构进行预处理,生成对应的目标版本号,然后对待发送信息进行序列化处理,得到对应的字节流,发送给客户端,其中待发送信息中携带了目标版本号。客户端获取到字节流后,根据目标版本号对字节流进行反序列化处理,得到对应的消息结构。本发明实施例中,内容不同的消息结构对应的版本号各不相同,即目标版本号与消息结构的内容直接相关且唯一对应,因此本发明实施例提供的方法具有良好的版本控制,避免了不同的对象定义可能分配到相同的版本号的问题,保证了序列化和反序列化时对应的是相同版本号的协议,从而避免了序列化和反序列化的版本不一致导致程序运行出错的问题。
下面结合图3对本申请的方案进行详细说明。图3为本发明又一实施例提供的消息结构的序列化和反序列化方法的交互示意图,如图3所示,包括:
S301,服务器获取可扩展标记语言结构定义格式的消息结构。
可扩展标记语言(Extensible Markup Language,XML)是标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。在计算机中,标识是指计算机所能理解的信息符号,通过标记,计算机之间可以处理包含各种的信息。XML可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。可扩展标记语言结构定义(XML Schema Definition,以下简称XSD),XML Schema语言即XSD。XSD描述了XML文档的结构。可以用一个指定的XSD来验证某个XML文档,以检查该XML文档是否符合其要求。文档设计者可以通过XSD指定一个XML文档所允许的结构和内容,并可据此检查一个XML文档是否是有效的。一个XSD会定义:文档中出现的元素、文档中出现的属性、子元素、子元素的数量、子元素的顺序、元素是否为空、元素和属性的数据类型、元素或属性的默认和固定值。XSD文件的后缀名为.xsd。本发明实施例通过XSD来定义序列化的具体格式,其优点如下:
1)多平台和框架都内建对XSD的支持;
2)XSD有统一的标准化处理,保证一种结构定义有唯一对应的版本号,且在改变定义的排版格式时不影响对应的版本号。
通过XSD文件来对消息结构进行描述,并根据消息结构的内容得到唯一的版本号,因此,在序列化和反序列化的过程中,只需要传输状态信息的数据,而无需传输状态信息的结构。在反序列化时,根据目标版本号就能够唯一确定状态信息的结构,然后结合状态信息的结构,将序列化得到的字节流反向转换为内存中结构化的对象。
下面对XSD的消息结构定义进行举例说明,下述代码是采用XSD定义序列化格式的实例:
<xs:conplexType name="GetUserData2Resp">
<xs:sequence>
<xs:element name="name"type="xs:string"/>
<xs:element name="icon"type="xs:string"/>
<xs:element name="status"type="varUnsignedShort"/>
<xs:element name="ball_type"type="varUnsignedShort"/>
<xs:element name="diamond_reward_progress"type="varUnsignedInt"/>
<xs:element name="sync_time"type="varUnsignedLong"/>
<xs:element name="remaining_ad_times"type="varUnsignedShort"/>
<xs:element name="bought_newcomer_package"type="varUnsignedShort"/>
<xs:element name="signed_in_methods"type="varUnsignedShort"/>
<xs:element name="signed_in_days"type="varUnsignedShort"/>
<xs:element name="paid"type="varUnsignedShort"/>
<xs:element name="sub_free_trial"type="varUnsignedShort"/>
<xs:element name="received_sub_reward"type="varUnsignedShort"/>
<xs:element name="time_limited_props"type="xs:string"/>
<xs:element name="aircraft_id"type="varInt"/>
<xs:element name="aircrafts"type="Aircraft"maxOccurs="unbounded"/>
<xs:element name="received_skill_reward"type="varShort"/>
<xs:element name="received_examine_description_reward"type="varShort"/>
<xs:element name="properties"type="Property"maxOccurs="unbounded"/>
<xs:element name="passed_levels"type="PassedLevel"maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
其中,使用xs:complexType定义消息结构,xs:element定义字段名以及字段类型,maxOccurs来定义数组类型,其中的var前缀的type属性是自定义的变长类型,PassedLevel,Property等是嵌套的complexType。
S302,对所述可扩展标记语言结构定义格式的消息结构进行标准化处理,得到处理后的消息结构。
标准化处理包括去除可扩展标记语言结构定义格式的消息结构中的注释和对可扩展标记语言结构定义格式的消息结构中的字段进行排序。XSD很多部分都是顺序无关的,将XSD中顺序无关部分的元素(element)和属性(attribute)排序,丢弃所有注释和特殊标记,排序后用XSD的XML标准化方式整理格式,可得到处理后的消息结构。
S303,根据所述处理后的消息结构,得到所述目标版本号。
得到处理后的消息结构后,可通过加密算法来计算指纹,例如可以采用消息摘要(message digest,以下简称MD5)算法或安全哈希(Secure Hash Algorithm,以下简称SHA1)算法,得到对应的目标版本号,即接口版本。通过此种方式得到的目标版本号,与消息结构的内容直接相关并且一一对应。
S304,通过可扩展样式表转换语言对所述消息结构进行处理,得到多种编程语言下的代码。
可扩展样式表转换语言(Extensible Stylesheet Language Transformations,以下简称XSLT)是一种样式转换标记语言,可以将XML数据档转换为另外的XML或其它格式,如HTML网页,纯文字。
本发明实施例中,可采用XSLT作为编译器,编译为多种语言本身的接口定义文件。采用XSLT作为编译器编译时,需要开发人员针对目标编程语言编写相应的编译器,编写基本数据类型的序列化函数与反序列化函数代码。对于整数,使用变长压缩编码(每个字节的低7位编码数据,最高位作为标志位表示是否还有后续字节,对于负数编码绝对值,内存中的类型对应64位整数);对于浮点数,采用定长编码,遵循IEEE标准;对于文本字符串,使用变长编码的整数标识长度,后面为实际的文本内容。
以C++为例,对为C++编程语言生产代码的情况,结果为两组类定义:
第一组为模板类,实际上表述的是网络上的传输格式;
第二组为普通类,实际上表述的是内存中的存放格式,这也是应用程序代码真正使用的数据结构定义。实际使用时用一个版本的模板类去套另外一个版本的普通类,即将普通类作为模板类的类型参数实现前期绑定,因为会随C++编译器一起编译为机器指令。
对客户端,模板类和普通类都为当前版本,对服务器端,模板类为多个版本,分别对应每个客户端,内存类一般为最新版本,供服务器逻辑使用。
例如,针对上述采用XSD定义序列化格式的实例,采用C++编译出的普通类结果如下:
Figure BDA0002145376010000111
针对上述采用XSD定义序列化格式的实例,采用C++编译出的模板类结果如下:
Figure BDA0002145376010000121
Figure BDA0002145376010000131
S305,服务器根据第一编程语言下的序列化函数代码对所述待发送信息进行序列化处理,得到对应的字节流。
通过XSLT对消息结构进行处理,可以得到多种编程语言下的代码,例如C语言代码、C++代码、Java代码等,对于通过XSLT处理消息结构后产生的每一种编程语言下的代码,都包括两个部分,第一个部分是消息结构对应的数据结构代码,用于描述状态信息的结构,第二个部分是对应编程语言下的序列化函数代码和反序列化函数代码,用于对消息结构进行序列化处理和反序列化处理。
对于服务器当前使用的第一编程语言来说,根据第一编程语言下的序列化函数代码,能够对待发送信息进行序列化处理,从而得到对应的字节流。
S306,服务器向客户端发送所述字节流。
S307,客户端获取服务器发送的字节流。
服务器通过对待发送信息中状态信息的数据进行序列化处理,得到字节流后,会向客户端发送字节流,客户端接收该字节流,同时,由于待发送信息中携带有目标版本号,因此客户端能够获取到该目标版本号,从而保证序列化之前和反序列化之后对应的是同一个XSD文件。
S308,客户端根据所述目标版本号获取多种编程语言下的第一代码和第二代码。
通过待发送信息中携带的目标版本号,得到多种编程语言下的第一代码和第二代码,其中,多种编程语言可以包括C语言、C++、Java等,第一代码指的是一种编程语言下消息结构对应的数据结构代码,第二代码指的是一种编程语言下的序列化函数代码和反序列化函数代码。
S309,客户端通过第二编程语言下的反序列化函数代码将所述字节流进行反序列化处理,得到所述第二编程语言下的数据。
客户端有对应的编程语言,即第二编程语言。在得到多种编程语言下的代码后,客户端根据自身采用的第二编程语言,来获取第二编程语言下的反序列化函数代码,并通过第二编程语言下的反序列化函数代码对字节流进行反序列化处理,得到第二编程语言下的数据。
S310,客户端通过所述第二编程语言下的第一代码和所述第二编程语言下的数据,得到所述第二编程语言下的消息结构。
得到第二编程语言下的数据后,客户端通过运行第二编程语言下的第一代码,对第二编程语言下的数据进行处理,得到第二编程语言下的消息结构。例如,在C++中的一个结构体为struct,且struct中包含两个元素,分别是int a和char b,则对其进行序列化和反序列化,得到Java中对应的消息结构为类,该类中包含两个元素,分别是int a和char b。
本发明实施例提供的消息结构的序列化和反序列化方法,首先服务器获取可扩展标记语言结构定义格式的消息结构,并对消息结构进行标准化处理,根据处理后的消息结构生成对应的目标版本号,然后通过可扩展样式表转换语言对待发送信息进行序列化处理,得到对应的字节流,发送给客户端,其中待发送信息中携带了目标版本号。客户端获取到字节流后,根据目标版本号对字节流进行反序列化处理,得到对应的消息结构。本发明实施例中,内容不同的消息结构对应的版本号各不相同,即目标版本号与消息结构的内容直接相关且唯一对应,因此本发明实施例提供的方法具有良好的版本控制,避免了不同的对象定义可能分配到相同的版本号的问题,保证了序列化和反序列化时对应的是相同版本号的协议,从而避免了序列化和反序列化的版本不一致导致程序运行出错的问题。同时,本发明实施例无需传输字段名以及字段类型信息,减少了序列化结构的体积,减少了网络传输消耗的网络流量,无需在运行时进行字段类型判断等信息的处理,提高了运行的速度。
图4为本发明实施例提供的消息结构的序列化装置的结构示意图,如图4所示,包括处理模块41、序列化模块42和发送模块43,其中:
处理模块41用于获取消息结构,对所述消息结构进行预处理,生成对应的目标版本号,其中,内容不同的消息结构对应的版本号各不相同,所述消息结构为服务器向客户端传送的状态信息的结构;
序列化模块42用于对待发送信息进行序列化处理,得到对应的字节流,所述待发送信息中携带所述状态信息的数据和所述目标版本号;
发送模块43用于向客户端发送所述字节流。
在一种可能的实现方式中,所述消息结构的格式为可扩展标记语言结构定义格式,所述序列化模块42具体用于:
通过可扩展样式表转换语言对所述消息结构进行处理,得到多种编程语言下的代码,其中,每种所述编程语言下的代码包括第一代码和第二代码,所述第一代码为所述消息结构对应的数据结构代码,所述第二代码为序列化函数代码和反序列化函数代码;
根据第一编程语言下的序列化函数代码对所述待发送信息进行序列化处理,得到对应的字节流,其中,所述第一编程语言为所述多种编程语言中的一种。
在一种可能的实现方式中,所述处理模块41具体用于:
获取可扩展标记语言结构定义格式的消息结构;
对所述可扩展标记语言结构定义格式的消息结构进行标准化处理,得到处理后的消息结构,其中,所述标准化处理包括去除所述可扩展标记语言结构定义格式的消息结构中的注释和对所述可扩展标记语言结构定义格式的消息结构中的字段进行排序;
根据所述处理后的消息结构,得到所述目标版本号。
图5为本发明实施例提供的消息结构的反序列化装置的结构示意图,如图5所示,包括获取模块51和反序列化模块52,其中:
获取模块51用于获取服务器发送的字节流,所述字节流包括状态信息的数据和目标版本号,所述字节流是所述服务器对所述状态信息的数据和目标版本号进行序列化处理得到的;
反序列化模块52用于根据所述目标版本号对所述字节流进行反序列化处理,得到对应的消息结构。
在一种可能的实现方式中,所述反序列化模块52具体用于:
根据所述目标版本号获取多种编程语言下的代码,其中,每种所述编程语言下的代码包括第一代码和第二代码,所述第一代码为所述消息结构对应的数据结构代码,所述第二代码为序列化函数代码和反序列化函数代码,所述字节流是根据第一编程语言下的序列化函数代码对消息结构的数据进行序列化处理得到的,所述第一编程语言为所述多种编程语言中的一种;
通过第二编程语言下的反序列化函数代码将所述字节流进行反序列化处理,得到所述第二编程语言下的数据,其中,所述第二编程语言为所述多种编程语言中的一种;
通过所述第二编程语言下的第一代码和所述第二编程语言下的数据,得到所述第二编程语言下的消息结构。
在一种可能的实现方式中,所述反序列化模块52具体用于:
根据所述目标版本号获取对应的可扩展标记语言结构定义格式的消息结构;
根据所述可扩展标记语言结构定义格式的消息结构获取所述多种编程语言下的第一代码和第二代码。
本发明实施例提供的装置,可用于执行上述方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。
图6为本发明实施例提供的消息结构的序列化和反序列化设备的硬件结构示意图,如图6所示,该消息结构的序列化和反序列化设备包括:至少一个处理器61和存储器62。其中,处理器61和存储器62通过总线63连接。
可选地,该模型确定还包括通信部件。例如,通信部件可以包括接收器和/或发送器。
在具体实现过程中,至少一个处理器61执行所述存储器62存储的计算机执行指令,使得至少一个处理器61执行如上的消息结构的序列化和反序列化方法。
处理器61的具体实现过程可参见上述方法实施例,其实现原理和技术效果类似,本实施例此处不再赘述。
在上述图6所示的实施例中,应理解,处理器可以是中央处理单元(英文:CentralProcessing Unit,简称:CPU),还可以是其他通用处理器、数字信号处理器(英文:DigitalSignal Processor,简称:DSP)、专用集成电路(英文:Application Specific IntegratedCircuit,简称:ASIC)等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合发明所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
存储器可能包含高速RAM存储器,也可能还包括非易失性存储NVM,例如至少一个磁盘存储器。
总线可以是工业标准体系结构(Industry Standard Architecture,ISA)总线、外部设备互连(Peripheral Component,PCI)总线或扩展工业标准体系结构(ExtendedIndustry Standard Architecture,EISA)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,本申请附图中的总线并不限定仅有一根总线或一种类型的总线。
本申请还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如上所述的消息结构的序列化和反序列化方法。
上述的计算机可读存储介质,上述可读存储介质可以是由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(SRAM),电可擦除可编程只读存储器(EEPROM),可擦除可编程只读存储器(EPROM),可编程只读存储器(PROM),只读存储器(ROM),磁存储器,快闪存储器,磁盘或光盘。可读存储介质可以是通用或专用计算机能够存取的任何可用介质。
一种示例性的可读存储介质耦合至处理器,从而使处理器能够从该可读存储介质读取信息,且可向该可读存储介质写入信息。当然,可读存储介质也可以是处理器的组成部分。处理器和可读存储介质可以位于专用集成电路(Application Specific IntegratedCircuits,简称:ASIC)中。当然,处理器和可读存储介质也可以作为分立组件存在于设备中。
所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

Claims (8)

1.一种消息结构的序列化方法,其特征在于,包括:
获取消息结构,对所述消息结构进行预处理,生成对应的目标版本号,其中,内容不同的消息结构对应的版本号各不相同,所述消息结构为服务器向客户端传送的状态信息的结构;
对待发送信息进行序列化处理,得到对应的字节流,所述待发送信息中携带所述状态信息的数据和所述目标版本号;
向客户端发送所述字节流;
所述消息结构的格式为可扩展标记语言结构定义格式,所述对待发送信息进行序列化处理,得到对应的字节流,包括:
通过可扩展样式表转换语言对所述消息结构进行处理,得到多种编程语言下的代码,其中,每种所述编程语言下的代码包括第一代码和第二代码,所述第一代码为所述消息结构对应的数据结构代码,所述第二代码为序列化函数代码和反序列化函数代码;
根据第一编程语言下的序列化函数代码对所述待发送信息进行序列化处理,得到对应的字节流,其中,所述第一编程语言为所述多种编程语言中的一种。
2.根据权利要求1所述的方法,其特征在于,所述获取消息结构,对所述消息结构进行预处理,生成对应的目标版本号,包括:
获取可扩展标记语言结构定义格式的消息结构;
对所述可扩展标记语言结构定义格式的消息结构进行标准化处理,得到处理后的消息结构,其中,所述标准化处理包括去除所述可扩展标记语言结构定义格式的消息结构中的注释和对所述可扩展标记语言结构定义格式的消息结构中的字段进行排序;
根据所述处理后的消息结构,得到所述目标版本号。
3.一种消息结构的反序列化方法,其特征在于,包括:
获取服务器发送的字节流,所述字节流包括状态信息的数据和目标版本号,所述字节流是所述服务器对所述状态信息的数据和目标版本号进行序列化处理得到的;
根据所述目标版本号对所述字节流进行反序列化处理,得到对应的消息结构;
所述根据所述目标版本号对所述字节流进行反序列化处理,得到对应的消息结构,包括:
根据所述目标版本号获取多种编程语言下的代码,其中,每种所述编程语言下的代码包括第一代码和第二代码,所述第一代码为所述消息结构对应的数据结构代码,所述第二代码为序列化函数代码和反序列化函数代码,所述字节流是根据第一编程语言下的序列化函数代码对消息结构的数据进行序列化处理得到的,所述第一编程语言为所述多种编程语言中的一种;
通过第二编程语言下的反序列化函数代码将所述字节流进行反序列化处理,得到所述第二编程语言下的数据,其中,所述第二编程语言为所述多种编程语言中的一种;
通过所述第二编程语言下的第一代码和所述第二编程语言下的数据,得到所述第二编程语言下的消息结构。
4.根据权利要求3所述的方法,其特征在于,所述根据所述目标版本号获取多种编程语言下的代码,包括:
根据所述目标版本号获取对应的可扩展标记语言结构定义格式的消息结构;
根据所述可扩展标记语言结构定义格式的消息结构获取所述多种编程语言下的第一代码和第二代码。
5.一种消息结构的序列化装置,其特征在于,包括:
处理模块,用于获取消息结构,对所述消息结构进行预处理,生成对应的目标版本号,其中,内容不同的消息结构对应的版本号各不相同,所述消息结构为服务器向客户端传送的状态信息的结构;
序列化模块,用于对待发送信息进行序列化处理,得到对应的字节流,所述待发送信息中携带所述状态信息的数据和所述目标版本号;
发送模块,用于向客户端发送所述字节流;
所述序列化模块具体用于,通过可扩展样式表转换语言对所述消息结构进行处理,得到多种编程语言下的代码,其中,每种所述编程语言下的代码包括第一代码和第二代码,所述第一代码为所述消息结构对应的数据结构代码,所述第二代码为序列化函数代码和反序列化函数代码;根据第一编程语言下的序列化函数代码对所述待发送信息进行序列化处理,得到对应的字节流,其中,所述第一编程语言为所述多种编程语言中的一种。
6.一种消息结构的反序列化装置,其特征在于,包括:
获取模块,用于获取服务器发送的字节流,所述字节流包括状态信息的数据和目标版本号,所述字节流是所述服务器对所述状态信息的数据和目标版本号进行序列化处理得到的;
反序列化模块,用于根据所述目标版本号对所述字节流进行反序列化处理,得到对应的消息结构;
所述反序列化模块具体用于,根据所述目标版本号获取多种编程语言下的代码,其中,每种所述编程语言下的代码包括第一代码和第二代码,所述第一代码为所述消息结构对应的数据结构代码,所述第二代码为序列化函数代码和反序列化函数代码,所述字节流是根据第一编程语言下的序列化函数代码对消息结构的数据进行序列化处理得到的,所述第一编程语言为所述多种编程语言中的一种;通过第二编程语言下的反序列化函数代码将所述字节流进行反序列化处理,得到所述第二编程语言下的数据,其中,所述第二编程语言为所述多种编程语言中的一种;通过所述第二编程语言下的第一代码和所述第二编程语言下的数据,得到所述第二编程语言下的消息结构。
7.一种消息结构的序列化和反序列化设备,其特征在于,包括:至少一个处理器和存储器;
所述存储器存储计算机执行指令;
所述至少一个处理器执行所述存储器存储的计算机执行指令,使得所述至少一个处理器执行如权利要求1至2任一项所述的消息结构的序列化方法,或者,使得所述至少一个处理器执行如权利要求3至4任一项所述的消息结构的反序列化方法。
8.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如权利要求1至2任一项所述的消息结构的序列化方法,或者,实现如权利要求3至4任一项所述的消息结构的反序列化方法。
CN201910682876.1A 2019-07-26 2019-07-26 消息结构的序列化和反序列化方法及装置 Active CN110597500B (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN201910682876.1A CN110597500B (zh) 2019-07-26 2019-07-26 消息结构的序列化和反序列化方法及装置
US16/695,478 US11044140B2 (en) 2019-07-26 2019-11-26 Method and apparatus for serialization and deserialization of message structure

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910682876.1A CN110597500B (zh) 2019-07-26 2019-07-26 消息结构的序列化和反序列化方法及装置

Publications (2)

Publication Number Publication Date
CN110597500A CN110597500A (zh) 2019-12-20
CN110597500B true CN110597500B (zh) 2023-04-18

Family

ID=68853169

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910682876.1A Active CN110597500B (zh) 2019-07-26 2019-07-26 消息结构的序列化和反序列化方法及装置

Country Status (2)

Country Link
US (1) US11044140B2 (zh)
CN (1) CN110597500B (zh)

Families Citing this family (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113329046A (zh) * 2020-02-28 2021-08-31 珠海格力电器股份有限公司 数据传输方法、系统以及存储介质
CN111857658A (zh) * 2020-06-19 2020-10-30 北京字节跳动网络技术有限公司 一种渲染动态组件的方法、装置、介质和电子设备
CN111752547A (zh) * 2020-06-30 2020-10-09 武汉虹信技术服务有限责任公司 一种修改Java序列化对象序列号的方法及其应用
CN112069773A (zh) * 2020-07-23 2020-12-11 北京三快在线科技有限公司 数据处理系统、方法、装置、电子设备和计算机可读介质
CN112162755B (zh) * 2020-09-28 2023-03-31 抖音视界有限公司 一种数据处理方法、装置、介质和电子设备
CN113204683B (zh) * 2021-06-04 2022-07-01 腾讯科技(成都)有限公司 信息重构方法和装置、存储介质及电子设备
CN113687817B (zh) * 2021-08-16 2023-10-31 山东新一代信息产业技术研究院有限公司 一种消息格式解析器及解析方法
CN114070892A (zh) * 2021-11-25 2022-02-18 维沃移动通信有限公司 数据传输方法和装置
CN114268620A (zh) * 2021-12-13 2022-04-01 深圳供电局有限公司 一种用于物联网智能设备的数据压缩传输方法
CN114509064A (zh) * 2022-02-11 2022-05-17 上海思岚科技有限公司 一种自主扩展传感器数据处理的方法、接口及设备
CN114519026A (zh) * 2022-02-17 2022-05-20 深圳集智数字科技有限公司 串口通信方法及装置
CN115129325B (zh) * 2022-06-29 2023-05-23 北京五八信息技术有限公司 一种数据处理方法、装置、电子设备及存储介质
CN114900570B (zh) * 2022-07-13 2022-10-18 江西联创精密机电有限公司 一种标准化数据采集传输方法及系统

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
FI20010828A (fi) * 2001-04-23 2002-10-24 Nokia Corp Erilaisten palveluversioiden käsitteleminen palvelimessa
US7191196B2 (en) * 2001-06-28 2007-03-13 International Business Machines Corporation Method and system for maintaining forward and backward compatibility in flattened object streams
US20030233477A1 (en) * 2002-06-17 2003-12-18 Microsoft Corporation Extensible infrastructure for manipulating messages communicated over a distributed network
US7941747B2 (en) * 2003-10-07 2011-05-10 Gtech Rhode Island Corporation Automated generation of OLTP message source code
US8266384B1 (en) * 2011-11-04 2012-09-11 Recursion Software, Inc. System and method for managing an object cache
CN104077335B (zh) * 2013-05-07 2017-05-03 腾讯科技(深圳)有限公司 一种结构化数据的序列化、反序列化方法、装置和系统

Also Published As

Publication number Publication date
CN110597500A (zh) 2019-12-20
US20210028970A1 (en) 2021-01-28
US11044140B2 (en) 2021-06-22

Similar Documents

Publication Publication Date Title
CN110597500B (zh) 消息结构的序列化和反序列化方法及装置
US8572494B2 (en) Framework for development and customization of web services deployment descriptors
US9075833B2 (en) Generating XML schema from JSON data
US7596745B2 (en) Programmable hardware finite state machine for facilitating tokenization of an XML document
CN109522018B (zh) 页面处理方法、装置及存储介质
US8346737B2 (en) Encoding of hierarchically organized data for efficient storage and processing
WO2007058948A2 (en) Method and apparatus for virtualized xml parsing
WO2007058949A2 (en) Method and apparatus for hardware xml acceleration
WO2007058959A2 (en) Hardware unit for parsing an xml document
CN109814866B (zh) 页面应用转化为原生应用的处理方法和装置
US20070234199A1 (en) Apparatus and method for compact representation of XML documents
CN107704615B (zh) 基于中文字体子集化的网页字体显示方法及系统
CN113518094B (zh) 数据处理方法、装置、机器人和存储介质
WO2022142743A1 (zh) 可视化页面渲染方法、装置、设备及存储介质
CN111131403A (zh) 一种物联网设备的消息编解码方法及装置
CN109284453B (zh) 基于pdf文档的数据下载方法及装置、存储介质、终端
WO2023124425A1 (zh) 数据处理的方法、装置、电子设备及存储介质
US20080313291A1 (en) Method and apparatus for encoding data
TWI448910B (zh) 可擴充xml建構之部份類型編程模型
CN111399786A (zh) 打印文件的生成方法、装置、终端设备及存储介质
US10956659B1 (en) System for generating templates from webpages
CN111737621A (zh) 基于wasm的ofd渲染方法、系统及装置
CN113127776A (zh) 面包屑路径生成方法、装置及终端设备
CN105793842B (zh) 序列化消息之间的转换方法和装置
US7571196B2 (en) Type evolution

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
GR01 Patent grant