CN113326032A - 一种数据序列化方法及装置、设备、存储介质 - Google Patents
一种数据序列化方法及装置、设备、存储介质 Download PDFInfo
- Publication number
- CN113326032A CN113326032A CN202110624032.9A CN202110624032A CN113326032A CN 113326032 A CN113326032 A CN 113326032A CN 202110624032 A CN202110624032 A CN 202110624032A CN 113326032 A CN113326032 A CN 113326032A
- Authority
- CN
- China
- Prior art keywords
- variable
- serialization
- value
- data
- instance
- 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.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 157
- 230000008569 process Effects 0.000 claims abstract description 66
- 238000012545 processing Methods 0.000 claims abstract description 56
- 230000007246 mechanism Effects 0.000 claims abstract description 27
- 230000006870 function Effects 0.000 claims description 154
- 238000004590 computer program Methods 0.000 claims description 8
- 230000002596 correlated effect Effects 0.000 claims description 3
- 230000003993 interaction Effects 0.000 description 20
- 238000011161 development Methods 0.000 description 19
- 230000000875 corresponding effect Effects 0.000 description 18
- 238000010586 diagram Methods 0.000 description 15
- 230000004044 response Effects 0.000 description 12
- 238000004891 communication Methods 0.000 description 9
- 238000005516 engineering process Methods 0.000 description 7
- 230000005540 biological transmission Effects 0.000 description 6
- 230000002452 interceptive effect Effects 0.000 description 6
- 230000001960 triggered effect Effects 0.000 description 4
- 238000003491 array Methods 0.000 description 3
- 238000004364 calculation method Methods 0.000 description 3
- 230000008878 coupling Effects 0.000 description 3
- 238000010168 coupling process Methods 0.000 description 3
- 238000005859 coupling reaction Methods 0.000 description 3
- 238000012423 maintenance Methods 0.000 description 3
- 230000003287 optical effect Effects 0.000 description 3
- 230000009286 beneficial effect Effects 0.000 description 2
- 238000013461 design Methods 0.000 description 2
- 230000014509 gene expression Effects 0.000 description 2
- 101150064138 MAP1 gene Proteins 0.000 description 1
- 101150009249 MAP2 gene Proteins 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 238000009795 derivation Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000000977 initiatory effect Effects 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 238000006467 substitution reaction Methods 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/20—Software design
- G06F8/24—Object-oriented
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请实施例公开了一种数据序列化方法及装置、设备、存储介质,其中,该方法包括:获取预设类的实例的至少一个成员变量;利用所述实例调用在所述预设类的基类中定义的序列化函数;其中,在所述序列化函数被调用的过程中执行以下步骤:调用在所述基类中声明并在所述预设类中定义的变量存储函数;其中,所述变量存储函数用于获取每一所述成员变量的变量名和取值,并对每一所述成员变量的变量名和取值进行关联存储,每一所述成员变量的变量名是基于自定义的反射机制确定的;基于关联存储的每一所述成员变量的变量名和取值,进行序列化处理,得到序列化处理后的数据。
Description
技术领域
本申请实施例涉及但不限于计算机技术领域,尤其涉及一种数据序列化方法及装置、设备、存储介质。
背景技术
随着计算机技术的发展,越来越多的技术应用在金融领域,传统金融业正在逐步向金融科技(Fintech)转变,然而,由于金融行业的安全性、实时性要求,金融科技也对技术提出了更高的要求。金融科技领域下,相关技术中的应用系统通常采用前后端分离的架构,前后端之间采用序列化格式进行数据交互。此外,不同的后端服务之间往往也需要进行服务接口的调用,在调用接口进行数据传输的过程中,通常也是采用序列化格式进行数据传输。因此,在应用系统开发的过程中,需要耗费很大一部分工作用于开发及调试基于序列化格式的接口。相关技术中的数据序列化方法,对每一个基于序列化格式的接口进行开发的过程中,都需要写很多重复代码,开发效率低,且容易出错,难于维护。
发明内容
有鉴于此,本申请实施例为解决相关技术中存在的至少一个问题而提供一种数据序列化方法及装置、设备、存储介质。
本申请实施例的技术方案是这样实现的:
一方面,本申请实施例提供一种数据序列化方法,所述方法包括:
获取预设类的实例的至少一个成员变量;
利用所述实例调用在所述预设类的基类中定义的序列化函数;其中,在所述序列化函数被调用的过程中执行以下步骤:
调用在所述基类中声明并在所述预设类中定义的变量存储函数;其中,所述变量存储函数用于获取每一所述成员变量的变量名和取值,并对每一所述成员变量的变量名和取值进行关联存储,每一所述成员变量的变量名是基于自定义的反射机制确定的;
基于关联存储的每一所述成员变量的变量名和取值,进行序列化处理,得到序列化处理后的数据。
另一方面,本申请实施例提供一种数据序列化装置,所述装置包括:
获取模块,用于获取预设类的实例的至少一个成员变量;
序列化模块,用于利用所述实例调用在所述预设类的基类中定义的序列化函数;其中,在所述序列化函数被调用的过程中执行以下步骤:调用在所述基类中声明并在所述预设类中定义的变量存储函数;其中,所述变量存储函数用于获取每一所述成员变量的变量名和取值,并对每一所述成员变量的变量名和取值进行关联存储,每一所述成员变量的变量名是基于自定义的反射机制确定的;基于关联存储的每一所述成员变量的变量名和取值,进行序列化处理,得到序列化处理后的数据。
再一方面,本申请实施例提供一种数据序列化设备,包括存储器和处理器,所述存储器存储有可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述方法中的步骤。
又一方面,本申请实施例提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述方法中的步骤。
在本申请实施例中,一方面,基于自定义的反射机制可以确定预设类中至少一个成员变量的变量名,进而可以对每一成员变量的变量名和取值进行关联存储,并基于关联存储的每一成员变量的变量名和取值进行序列化处理,得到序列化处理后的数据;另一方面,在该预设类的基类中定义实现数据序列化的序列化函数,并在该序列化函数中调用在该基类中声明、在该预设类中定义的变量存储函数,来获取该预设类的实例的至少一个成员变量的变量名和取值,并对每一成员变量的变量名和取值进行关联存储,然后在该序列化函数中基于关联存储的每一成员变量的变量名和取值进行序列化处理,得到序列化处理后的数据。这样,由于变量存储函数可以在基类中声明并在继承自该基类的预设类中定义,从而在基类中可以根据不同的子类实现相应的成员变量的变量名和取值的关联存储,进而通过利用继承自该基类的预设类的实例调用该基类中定义的序列化函数,可以简单快速地实现实例的序列化。此外,在进行预设类的开发时,只需关注该预设类的实例中各成员变量的取值的获取,无需再大量进行序列化对象的赋值、序列化等重复、易出错的代码的开发,从而可以提升第一服务的开发效率,降低开发过程中的出错率以及应用系统的维护难度。
附图说明
图1A为相关技术中的接口开发流程的示意图;
图1B为本申请实施例提供的一种数据序列化方法的实现流程示意图;
图2为本申请实施例提供的一种数据序列化方法的实现流程示意图;
图3为本申请实施例提供的一种数据序列化方法的实现流程示意图;
图4A为本申请实施例提供的一种数据交互接口的实现框架示意图;
图4B为本申请实施例提供的一种m_vmapData数据对应的内存结构示意图;
图4C为本申请实施例提供的一种从数据容器中获取数据调用JSON序列化方法的实现流程示意图;
图4D为本申请实施例提供的一种从m_vmapData中获取数据并调用JSON序列化方法的实现流程示意图;
图4E为本申请实施例提供的一种从m_vJsonData中获取数据并调用JSON序列化方法的实现流程示意图;
图5为本申请实施例数据序列化装置的组成结构示意图;
图6为本申请实施例提供的一种数据序列化设备的硬件实体示意图。
具体实施方式
为了使本申请的目的、技术方案和优点更加清楚,下面结合附图和实施例对本申请的技术方案进一步详细阐述,所描述的实施例不应视为对本申请的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。
在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。
如果申请文件中出现“第一/第二”的类似描述则增加以下的说明,在以下的描述中,所涉及的术语“第一\第二\第三”仅仅是区别类似的对象,不代表针对对象的特定排序,可以理解地,“第一\第二\第三”在允许的情况下可以互换特定的顺序或先后次序,以使这里描述的本申请实施例能够以除了在这里图示或描述的以外的顺序实施。
除非另有定义,本文所使用的所有的技术和科学术语与属于本申请的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本申请实施例的目的,不是旨在限制本申请。
下面结合附图和实施例对本申请的技术方案进一步详细阐述。
对本申请实施例进行进一步详细说明之前,对本申请实施例中涉及的名词和术语进行说明,本申请实施例中涉及的名词和术语适用于如下的解释。
1)宏:计算机科学里的宏是一种抽象的,根据一系列预定义的规则替换文本的模式,例如C++语言中所定义的#define的功能。解释器或编译器在遇到宏时会自动进行该模式替换。对于编译语言,在编译阶段,将由预处理器将源文件中出现的宏引用展开成相应的宏定义;
2)基类:在面向对象设计中,基类被定义为包含所有实体共性的class类型;
3)派生类:利用继承机制,可以从已有的类中派生出新的类,派生出的新的类称为派生类,派生类可以从基类继承,具有基类所有共性的类。派生类也称子类;
4)纯虚函数:纯虚函数是在基类中声明的虚函数,基类的任何子类都要实现该函数,以实现多态性;
5)多态:是面向对象编程语言的一大特点,多态的核心理念就是通过基类访问子类中定义的函数。实现多态有很多种方法,例如可以通过纯虚函数实现多态;
6)反射机制:主要是指程序可以访问、检测和修改本身状态或行为的一种能力。反射机制的能力很多,例如基类获取子类成员变量、成员方法的能力;
7)JSON(JavaScript Object Notation):是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,并能有效提升网络传输效率;
8)key/value:键值对。key是关键字,value是值;
9)序列化:是指将具有一定结构的数据转换成可以存取或者可以传输的形式,比如转换成字符流的形式。通过序列化后,数据可以在系统各逻辑模块或者网络中传输。
为了更好地理解本申请实施例提供的数据序列化方法,下面先对相关技术中的数据序列化方案进行说明。
以两个后端服务之间基于JSON格式进行交互的接口的实现为例,参见图1A,相关技术中,每个接口的开发包括线下流程10和程序开发流程20,其中,开发人员可以在线下流程10中根据接口需要定义接口字段;在程序开发流程20中可以基于线下流程10中定义的接口字段完成接口程序的开发,得到的接口程序被执行时可以实现如下步骤:
步骤S21,系统初始化;
步骤S22,获取所有字段的取值;
这里,如果是服务请求方,需要根据定义的请求字段,获取各请求字段的取值,如果是服务响应方,需要根据定义的响应字段,获取各响应字段的取值。
步骤S23,调用JSON对象赋值语句:通过调用JSON对象赋值语句,可以依次将接口字段添加至JSON对象中,作为JSON对象的字段,并将JSON对象中的各字段赋值为对应的字段取值;
步骤S24,调用JSON序列化方法:通过调用JSON序列化方法,可以将JSON对象序列化为JSON字符串;
步骤S25,请求/响应对方服务:通过对方服务提供的服务请求接口将该JSON字符串发送给对方服务,或者在响应对方服务的请求时,将该JSON字符串返回给对方服务。
在上述相关技术的数据序列化方案中,存在以下问题:1)开发效率低,由于每个接口的实现都是独立的,在每个接口中都需要实现上述步骤,从而在开发多个接口时,需要编写大量重复的代码,对于一个中小型的系统,所提供的接口数量一般有几十个,平均每个接口的字段几十个,对于较大型的系统,接口数量往往达到几百个,因此,该方案重复工作量大,导致开发效率低;2)容易出错,难于维护,在调用JSON对象赋值时,需要开发人员手动将接口的字段名与接口类中用来存储接口字段值的变量一一对应起来,容易出错,且错误不容易察觉,此外后续接口字段的修改也需要多处同步进行,导致接口程序难于维护。
本申请实施例提供一种数据序列化方法,该方法可以由运行在计算机设备上的第一服务执行。其中,计算机设备指的可以是服务器、笔记本电脑、平板电脑、台式计算机、智能电视、机顶盒、移动设备(例如移动电话、便携式视频播放器、个人数字助理、专用消息设备、便携式游戏设备)等具备数据处理能力的设备。图1B为本申请实施例数据序列化方法的实现流程示意图,如图1B所示,该方法包括:
步骤S101,获取预设类的实例的至少一个成员变量;
这里,预设类可以是面向对象程序语言中的任意合适的类,预设类的实例为当前需要进行序列化处理的实例,该实例具有一个或多个成员变量。对于预设类的实例,该实例的每个成员变量具有一个相应的取值。在实施时,可以采用任意合适的方式获取该实例的每个成员变量的取值,这里并不限定。例如,各成员变量的取值可以是设定的常量,也可以通过设定的计算过程计算得到的,还可以是通过查询数据库得到的。在一些实施例中,该实例的每个成员变量可以直接对应该第一服务需要与其他服务进行交互的各接口字段。
至少一个成员变量可以是该实例的全部成员变量,也可以为该实例中需要被序列化的部分成员变量,这里并不限定。
步骤S102,利用所述实例调用在所述预设类的基类中定义的序列化函数;其中,在所述序列化函数被调用的过程中执行以下步骤:
调用在所述基类中声明并在所述预设类中定义的变量存储函数,其中,所述变量存储函数用于获取每一所述成员变量的变量名和取值,并对每一所述成员变量的变量名和取值进行关联存储,每一所述成员变量的变量名是基于自定义的反射机制确定的;
基于关联存储的每一所述成员变量的变量名和取值,进行序列化处理,得到序列化处理后的数据。
这里,序列化函数可以是基类中定义的一个可以被子类调用的函数或方法,由于预设类继承自该基类,因此,预设类的实例可以调用该序列化函数。例如,在第一服务采用的编程语言是C++的情况下,序列化函数可以是基类中的public或protected权限的函数。
序列化函数可以通过调用变量存储函数获取实例中需要进行序列化的每一成员变量的变量名和取值,并对每一所述成员变量的变量名和取值进行关联存储,进而基于关联存储的每一所述成员变量的变量名和取值,进行序列化处理,以实现该实例的序列化。在实施时,变量存储函数可以是基类中声明的一个纯虚函数,在基类的每个子类都需要对该变量存储函数的实现过程进行定义,由于面向对象编程语言中的多态性,利用预设类的实例调用序列化函数时,该序列化函数中调用的变量存储函数是基于预设类中的定义来实现的。
每一成员变量的变量名可以基于自定义的反射机制来确定。在一些实施例中,可以利用基类中定义的宏指令实现自定义的反射机制。例如,假设要获取实例的成员变量x的变量名,可以在基类中定义宏指令:#define varName(x)#x,并在预设类中定义的变量存储函数的实现中需要获取成员变量的变量名的代码处引入varName(x),这样,由于C++的宏中,#的功能是将其后面的宏参数进行字符串化操作,在第一服务的应用程序的编译阶段通过展开该宏指令可以自动将预设类中的varName(x)替换为字符串“x”,从而在基类中调用该变量存储函数可以获取实例中需要进行序列化的每一成员变量的变量名,进而可以获取每一成员变量的变量名和取值。
在一些实施例中,还可以由基类提供一个注册方法,预设类的实例可以通过调用该注册方法,将实例的成员变量名注册至基类,从而实现自定义的反射机制。例如,基类可以提供一个注册方法register(),在预设类中定义的变量存储函数的实现中需要获取成员变量的变量名的代码处,通过register(“x”,x)来调用该注册方法,从而将成员变量x的变量名注册至基类。
由于对实例的每个成员变量进行赋值时会将成员变量的取值存储至内存中,通过可以通过地址引用、指针寻址等方式可以获取各成员变量的取值,这里并不限定。
在获取到每一成员变量的变量名和取值后,可以通过关联存储将每一成员变量的变量名和取值进行一一对应。每一成员变量的变量名和取值可以存储在基类可以访问的地址中,例如基类的成员变量中、设定的文件或数据库中,这里并不限定。在实施时,可以采用任意合适的方式对每一成员变量的变量名和取值进行关联存储,这里并不限定。例如,可以采用键值对的形式对每一成员变量的变量名和取值进行关联存储,对于每一成员变量,可以以该成员变量的变量名作为键值对的关键字,以该成员变量的取值作为该键值对的值;还可以采用字符串的形式对每一成员变量的变量名和取值进行关联存储,对于每一成员变量,可以将该成员变量的变量名和取值采用合适的方式拼接成一个字符串,并对每一成员变量对应的字符串进行存储。
由于关联存储的每一成员变量的变量名和取值之间是一一对应的,基于各变量名和取值对,可以进行序列化处理。在实施时,本领域技术人员可以根据实际需要采用合适的序列化格式对关联存储的每一成员变量的变量名和取值进行序列化处理,得到对应的序列化格式的数据。采用的序列化格式可以包括但不限于JSON格式、可扩展标记语言(eXtensible Markup Language,XML)格式等。
在一些实施例中,所述自定义的反射机制是利用所述基类中定义的宏指令实现的,每一所述成员变量的变量名是在所述第一服务的应用程序的编译阶段通过展开所述宏指令得到的。
在本申请实施例中,一方面,基于自定义的反射机制可以确定预设类中至少一个成员变量的变量名,进而可以对每一成员变量的变量名和取值进行关联存储,并基于关联存储的每一成员变量的变量名和取值进行序列化处理,得到序列化处理后的数据;另一方面,在该预设类的基类中定义实现数据序列化的序列化函数,并在该序列化函数中调用在该基类中声明、在该预设类中定义的变量存储函数,来获取该预设类的实例的至少一个成员变量的变量名和取值,并对每一成员变量的变量名和取值进行关联存储,然后在该序列化函数中基于关联存储的每一成员变量的变量名和取值进行序列化处理,得到序列化处理后的数据。这样,由于变量存储函数可以在基类中声明并在继承自该基类的预设类中定义,从而在基类中可以根据不同的子类实现相应的成员变量的变量名和取值的自动关联及存储,进而通过利用继承自该基类的预设类的实例调用该基类中定义的序列化函数,可以简单快速地实现实例的序列化。此外,在进行预设类的开发时,只需关注该预设类的实例中各成员变量的取值的获取,无需再大量进行序列化对象的赋值、序列化等重复、易出错的代码的开发,从而可以提升第一服务的开发效率,降低开发过程中的出错率以及应用系统的维护难度。
本申请实施例提供一种数据序列化方法,图2为本申请实施例数据序列化方法的实现流程示意图,如图2所示,该方法应用于第一服务中,包括:
步骤S201,在确定需要将预设类的实例发送至第二服务的情况下,获取所述实例的至少一个成员变量;
这里,第二服务是需要与第一服务进行数据交互的任意合适的服务。第一服务与第二服务之间基于序列化格式的数据进行交互。
预设类的实例可以是第一服务向第二服务发送数据请求时需要携带的请求数据,也可以是第一服务响应第二服务的数据请求时需要返回给第二服务的响应数据,这里并不限定。该实例的每个成员变量可以对应该第一服务需要与第二服务进行交互的各接口字段。各成员变量的取值可以是设定的常量,也可以通过设定的计算过程计算得到的,还可以是通过查询数据库得到的,这里并不限定。
在实施时,可以通过监听设定的函数是否被调用,或者是否接收到设定的参数等方式确定是否需要将预设类的实例发送至第二服务。例如,第一服务向第二服务发送数据请求时,或者第一服务响应第二服务的数据请求时,可以通过调用设定的函数来触发预设类的实例的序列化,以得到序列化处理后的数据,在监听到该函数被调用的情况下,可以确定需要将预设类的实例发送至第二服务。再如,第一服务向第二服务发送数据请求时,或者第一服务响应第二服务的数据请求时,可以通过调用目标实例的设定函数,并向该函数传输表征需要进行数据序列化的参数,来触发目标实例的序列化,在监听到接收到该参数的情况下,可以确定需要将预设类的实例发送至第二服务。
步骤S202,利用所述实例调用在所述预设类的基类中定义的序列化函数;其中,在所述序列化函数被调用的过程中执行以下步骤:
调用在所述基类中声明并在所述预设类中定义的变量存储函数;其中,所述变量存储函数用于获取每一所述成员变量的变量名和取值,并对每一所述成员变量的变量名和取值进行关联存储,每一所述成员变量的变量名是基于自定义的反射机制确定的;
基于关联存储的每一所述成员变量的变量名和取值,进行序列化处理,得到序列化处理后的数据;
将所述序列化处理后的数据发送给所述第二服务。
这里,序列化处理后的数据可以是第一服务与第二服务进行交互时携带的交互数据。序列化处理后的数据可以是第一服务向第二服务发起数据请求时需要携带的请求数据,第一服务可以在向第二服务发起数据请求时将序列化处理后的数据发送给第二服务。序列化处理后的数据也可以是第一服务响应第二服务的数据请求时需要返回给第二服务的响应数据,第一服务可以在响应第二服务的的数据请求时将序列化处理后的数据发送给第二服务。
在实施时,开发人员可以预先定义第一服务与第二服务进行交互时交互数据中携带的每一字段的格式,交互数据中每一字段可以对应预设类中的一个成员变量,成员变量的变量名即为对应的字段的字段名,成员变量的取值即为对应的字段的取值。例如,可以预先定义第一服务向第二服务发起数据请求时请求数据中携带的每一请求字段的格式,预设类中可以直接将每一请求字段的字段名作为成员变量的变量名;或者第一服务响应第二服务的数据请求时响应数据中携带的每一响应字段的字段名,预设类中可以直接将每一响应字段的字段名作为成员变量的变量名。
在本申请实施例中,在确定需要将预设类的实例发送至第二服务的情况下,获取实例的至少一个成员变量,并在序列化函数中将序列化处理后的数据发送给第二服务。这样,可以直接将实例的成员变量名作为第一服务与第二服务进行交互时交互数据中携带的字段的字段名,由于基类中自动将实例的各成员变量的变量名与取值进行关联,从而可以自动将交互数据中各字段的字段名与取值进行关联,不需要开发人员通过编写代码的方式将实例的成员变量的取值赋值给交互数据中的各字段,进而可以减少代码出错导致第一服务与第二服务之间交互出错的情况。此外,在基类中定义的序列化函数中被调用的过程中将序列化处理后的数据发送给第二接口,可以进一步减少在基类的各子类中编写大量重复代码的工作量,进而进一步提升了第一服务的开发效率。
本申请实施例提供一种数据序列化方法,图3为本申请实施例数据序列化方法的实现流程示意图,如图3所示,该方法包括:
步骤S301,在预设类的实例的数据发送函数被调用的情况下,确定需要将所述实例发送至第二服务;其中,所述实例的数据发送函数用于将所述实例以序列化格式发送至第二服务;
这里,数据发送函数可以是预设类中定义的任意合适的函数,可以用于将预设类的实例以序列化的格式发送至第二服务,在该数据发送函数被调用的情况下,可以确定需要将该实例发送至第二服务。在实施时,发送实例时可以采用任意合适的序列化格式,该序列化格式可以是用户定义的,也可以是系统默认的,这里并不限定。
在一些实施例中,所述序列化格式包括以下至少之一:JSON格式、XML格式。
步骤S302,响应于对所述实例的数据发送函数的调用操作,获取所述实例的至少一个成员变量;
这里,通过调用实例的数据发送函数可以触发执行将该实例以序列化格式发送至第二服务的过程,因而,可以在该数据发送函数被调用后,响应于对该实例的数据发送函数的调用操作,获取该实例的至少一个成员变量。
步骤S303,利用所述实例调用在所述预设类的基类中定义的序列化函数;其中,在所述序列化函数被调用的过程中执行以下步骤:
调用在所述基类中声明并在所述预设类中定义的变量存储函数;其中,所述变量存储函数用于获取每一所述成员变量的变量名和取值,并对每一所述成员变量的变量名和取值进行关联存储,每一所述成员变量的变量名是基于自定义的反射机制确定的;
基于关联存储的每一所述成员变量的变量名和取值,进行序列化处理,得到序列化处理后的数据;
将所述序列化处理后的数据发送给所述第二服务。
在本申请实施例中,在预设类的实例的数据发送函数被调用的情况下,确定需要将该实例发送至第二服务,并响应于对该实例的数据发送函数的调用操作,获取该实例的至少一个成员变量,以及利用该实例调用在所述预设类的基类中定义的序列化函数。这样,可以通过调用实例的数据发送函数触发执行将该实例以序列化格式发送至第二服务的过程。
本申请实施例提供一种数据序列化方法,该方法包括:
步骤S401,获取预设类的实例的至少一个成员变量;
步骤S402,利用所述实例调用在所述预设类的基类中定义的序列化函数;其中,在所述序列化函数被调用的过程中执行以下步骤S421至步骤S422:
步骤S421,调用在所述基类中声明并在所述预设类中定义的变量存储函数;其中,所述变量存储函数用于获取每一所述成员变量的变量名和取值,并对每一所述成员变量的变量名和取值进行关联存储,每一所述成员变量的变量名是基于自定义的反射机制确定的;
步骤S422,基于关联存储的每一所述成员变量的变量名和取值,进行序列化处理,得到序列化处理后的数据。
在实施时,上述步骤S422可以包括:
步骤S422a,基于关联存储的每一所述成员变量的变量名和取值,确定与设定的序列化格式匹配的序列化对象;
这里,设定的序列化格式可以是开发人员或用户根据实际需要设定的,例如,可以包括但不限于JSON格式、XML格式等,这里并不限定。
序列化对象是与该序列化格式匹配的对象。例如,在设定的序列化格式为JSON格式的情况下,与该序列化格式匹配的序列化对象可以是JSON对象。又如,在设定的序列化格式为XML格式的情况下,与该序列化格式匹配的序列化对象可以是XML对象。
关联存储的每一成员变量的变量名和取值之间是一一对应的。基于设定的序列化格式,可以利用每一组对应的变量名与取值对初始化后的序列化对象进行赋值。例如,在序列化对象为JSON对象的情况下,可以将每一组对应的变量名与取值作为键值对添加至JSON对象中。
步骤S422b,基于所述序列化格式,对所述序列化对象进行序列化处理,得到序列化处理后的数据。
这里,在确定格式化处理采用的序列化格式的情况下,可以基于该序列化格式对序列化对象进行序列化处理。在实施时,可以调用与该序列化格式匹配的第三方序列化函数对序列化对象进行处理,得到序列化处理后的数据,也可以基于序列化格式,采用自定义的序列化方法对序列化对象进行序列化处理,这里并不限定。例如,对与JSON对象,可以采用第三方的JSON序列化函数,将JSON对象转换为对应的JSON字符串,得到的JSON字符串即为序列化处理后的数据。
在本申请实施例中,基于关联存储的每一成员变量的变量名和取值,确定与设定的序列化格式匹配的序列化对象,并基于序列化格式,对序列化对象进行序列化处理,得到序列化处理后的数据。这样,可以简单快捷地基于关联存储的每一所述成员变量的变量名和取值,得到序列化处理后的数据。
本申请实施例提供一种数据序列化方法,该方法包括:
步骤S501,获取预设类的实例的至少一个成员变量;
步骤S502,利用所述实例调用在所述预设类的基类中定义的序列化函数;其中,在所述序列化函数被调用的过程中执行以下步骤S521至步骤S522:
步骤S521,调用在所述基类中声明并在所述预设类中定义的变量存储函数;其中,所述变量存储函数用于获取每一所述成员变量的变量名和取值,并对每一所述成员变量的变量名和取值进行关联存储,每一所述成员变量的变量名是基于自定义的反射机制确定的;
步骤S522,基于关联存储的每一所述成员变量的变量名和取值,进行序列化处理,得到序列化处理后的数据。
在实施时,所述变量存储函数被调用的过程中可以执行以下步骤:
步骤S521a,获取每一所述成员变量的变量名和取值;
步骤S521b,将每一所述成员变量的变量名和取值以键值对的形式存储至数据容器中。
这里,可以采用键值对的形式对每一成员变量的变量名和取值进行关联存储。对于每一成员变量,可以以该成员变量的变量名作为键值对的关键字,以该成员变量的取值作为该键值对的值,得到一键值对。
数据容器可以为任意合适的可以存储多组数据的容器,包括但不限于列表、数组、向量等。在实施时,数据容器可以是支持存储单一数据类型的容器,也可以是支持存储不同数据类型的容器,这里并不限定。
数据容器中存储的每组数据可以是包括至少一个键值对的键值对集合,也可以是一个序列化对象,每一序列化对象中包括至少一个键值对。本领域技术人员可以根据实际情况,采用合适的数据结构将每一成员变量的变量名和取值以键值对的形式存储至数据容器中,这里并不限定。
在一些实施例中,所述至少一个成员变量包括多组成员变量,上述步骤S521b,包括:以键值对的形式,将每一所述成员变量的变量名和取值按组存储至数据容器中;其中,所述数据容器中的每一元素包括一组成员变量的变量名和取值。这里,每组成员变量的变量名和取值可以采用键值对集合进行存储,也可以采用序列化对象进行存储,这里并不限定。
在一些实施例中,所述变量存储函数包括第一变量存储函数,所述数据容器包括第一数据容器,所述第一数据容器中的每一元素为键值对集合,所述第一变量存储函数被调用的过程中可以执行以下步骤:步骤S531,获取每一所述成员变量的变量名和取值;步骤S532,将每一所述成员变量的变量名和取值以键值对的形式存储至键值对集合中;步骤S533,将所述键值对集合存储至所述第一数据容器中。
在一些实施例中,所述第一变量存储函数被调用的过程中还执行以下步骤:步骤S534,将实例类型标识设置为第一类型。这里,实例类型标识为表征实例中需要进行序列化的成员变量的取值类型的标识。第一类型可以表征实例中需要进行序列化的成员变量的取值类型为字符串,也即每组成员变量的变量名和取值可以采用键值对集合进行存储,可以从第一数据容器中获取每一成员变量的变量名和取值。
上述步骤S522可以包括:
步骤S541,在确定所述实例类型标识为第一类型的情况下,对所述第一数据容器中的元素进行遍历,得到至少一个键值对集合;
步骤S542,针对每一所述键值对集合,基于所述键值对集合中的每一所述成员变量的变量名和取值,确定与设定的序列化格式匹配的序列化对象;
这里,对于键值对集合中的每一键值对,可以基于设定的序列化格式,利用每一键值对中的变量名与取值对初始化后的序列化对象进行赋值。例如,在序列化对象为JSON对象的情况下,可以将每一键值对添加至JSON对象中。
步骤S543,基于所述序列化格式,对每一所述序列化对象进行序列化处理,得到序列化处理后的数据。
在一些实施例中,所述变量存储函数包括第二变量存储函数,所述数据容器包括第二数据容器,所述第二数据容器中的每一元素为与设定的序列化格式匹配的序列化对象,所述第二变量存储函数被调用的过程中可以执行以下步骤:
步骤S551,获取每一所述成员变量的变量名和取值;
步骤S552,获取与所述序列化格式匹配的序列化对象;
这里,可以基于序列化格式新建一个序列化对象,也可以对已有的序列化对象进行初始化,得到与序列化格式匹配的序列化对象,这里并不限定。
步骤S553,将每一所述成员变量的变量名和取值以键值对的形式存储至所述序列化对象中;
步骤S554,将所述序列化对象存储至所述第二数据容器中。
在一些实施例中,所述第二变量存储函数被调用的过程中还执行以下步骤:步骤S555,将实例类型标识设置为第二类型。这里,第二类型可以表征实例中需要进行序列化的成员变量的取值类型为序列化对象,也即每组成员变量的变量名和取值可以采用序列化对象的形式进行存储,可以从第二数据容器中获取每一成员变量的变量名和取值。
上述步骤S522可以包括:步骤S561,在确定所述实例类型标识为第二类型的情况下,对所述第二数据容器中的元素进行遍历,得到至少一个与所述序列化格式匹配的序列化对象;步骤S562,基于所述序列化格式,对每一所述序列化对象进行序列化处理,得到序列化处理后的数据。
在一些实施例中,所述序列化格式包括以下至少之一:JSON格式、XML格式。
在本申请实施例中,在变量存储函数被调用的过程中获取每一所述成员变量的变量名和取值,并将每一所述成员变量的变量名和取值以键值对的形式存储至数据容器中。这样,可以简单快速地对每一所述成员变量的变量名和取值进行关联存储。
下面以采用C++编程语言实现基于JSON格式进行数据交互的接口为例,对本申请实施例进行进一步说明。本申请实施例提供了一种数据序列化方法,应用于第一服务,可以用于实现一种数据交互接口,该接口在框架底层实现了一定程度的反射机制,使得框架底层可以获取上层调用者的所有成员变量,框架底层还实现了数据JSON序列化处理中的JSON对象赋值、JSON对象序列化、请求/响应第二服务等流程。基于该数据序列化方法,在开发任意一个接口类的过程中,接口类可以继承于框架底层的基类,在接口类中只需要关注本接口所有字段值如何获取,再调用宏指令实现该基类的一个纯虚函数,便可快速完成整个接口开发,方便快捷,并且不会有字段名和变量绑定出错的情况。
图4A为本申请实施例提供的一种数据交互接口的实现框架示意图,如图4A所示,该数据交互接口的实现框架包括基类61和接口子类62,基类61提供了包含特定宏指令的头文件,基于该宏指令可以实现反射机制,接口子类62继承于基类61,并实现基类61的纯虚函数genDataMap。下面对基类在头文件中定义的宏指令实现的反射机制进行说明。
基类在头文件中定义如下变量:
一个key和value都是string类型的map,记为m_mData,map是STL(中文标准模板库)的一个关联容器,可以提供一对一的键值对散列,每个键值对中的key只能在map中出现一次;
一个类型为map的向量(vector),记为m_vmapData,其中,map的key和value都是string类型。向量是一个封装了动态大小数组的顺序容器,能够存放各种类型的对象;
一个类型为JSON对象的vector,记为m_vJsonData;
一个JSON对象,记为m_jData。
对于一般的接口子类,进行数据交互的所有字段类型都是string类型,因此,可以在基类的头文件中定义如下宏指令:
#define varName(x)#x,用于取得变量x字符串化后的值,在C++的宏中,“#”的功能是将其后面的宏变量进行字符串化操作;
#define StoreMap(x)m_mData[varName(x)]=x,用于将变量x的变量名和取值添加至m_mData中;
#define StoreMap2(x,y)do{x=y;m_mData[varName(x)]=x;}while(0),用于将变量y的值赋值给x,并将得到的变量x的变量名和取值添加至m_mData中;
#define PushMap do{if(m_mData.size()>0){m_dataFormat=MAP_FORMAT;m_vmapData.push_back(m_mData);m_mData.clear();}else{Log("m_mData empty");return sERROR;}}while(0),用于将m_mData添加至m_vmapData中,其中,m_dataFormat用于基类判断接口子类调用了何种格式的接口,以区分子类的字段类型是字符串,还是嵌套JSON的复杂序列,MAP_FORMAT表示接口子类调用了PushMap进行变量名和取值的存储。
对于较为复杂的接口子类,进行数据交互的字段中有嵌套JSON对象的类型,因此,还可以在基类的头文件中定义如下宏指令:
#define StoreJson(x)m_jData[varName(x)]=x,用于将变量x的变量名和取值添加至m_jData中;
#define PushJson do{if(!m_jData.empty()){m_dataFormat=JSON_FORMAT;m_vJsonData.push_back(m_jData);m_jData.clear();}else{Log("m_jData empty");return sERROR;}}while(0),用于将m_jData添加至m_vJsonData中,JSON_FORMAT表示接口子类调用了PushJson进行变量名和取值的存储。
由于C++编程语言本身不支持反射功能,对变量名也不做存储,程序代码在编译后不会出现变量名,所以,在C++中基类无法获取子类的成员变量。本申请实施例通过以上宏指令的组合使用,可以在接口子类中通过调用StoreMap、PushMap等宏指令实现基类的纯虚函数genDataMap,这样,由于编译器在编译阶段会将宏指令展开,在宏指令展开的过程中,展开宏#define varName(x)#x,可以得到变量x的变量名,进而可以得到并存储接口子类的变量名和变量值,最终接口子类的变量名和变量值会以键值对key/value的方式存储在基类的m_mData中,或者以JSON对象的方式存储在基类的m_jData中。
接口子类可以根据实际需求,基于上述基类定义的宏指令实现基类的genDataMap纯虚函数。例如,可以采用如下语句引用基类中的宏指令实现genDataMap纯虚函数:
StoreMap2(v1,getKey1());
StoreMap2(v2,getKey2());
……
StoreMap2(vn,getKeyn());
这里,在接口子类中需要定义成员变量v1、v2、……vn,成员变量v1、v2、……vn的变量名需要与接口进行数据交互时所需的接口字段的字段名保持一致。在实施时可以直接使用接口中定义的JSON数据的字段名作为接口类的变量名。如果接口数据交互的字段中有嵌套JSON对象的类型,则可以调用宏指令StoreJson实现genDataMap纯虚函数。由于接口子类继承于基类,并且实现了基类的纯虚函数genDataMap,从而所有接口子类在主流程函数调用genDataMap时形成多态,自动调用到对应的接口子类实现的genDataMap,从而将子类获取的变量传递给基类,进而基类在主流程函数中再调用后续步骤完成整个接口调用流程。
对于需要进行批量数据交互的接口子类,会存在多组接口字段需要序列化,每组字段接口对应的实例的变量名和取值都会以map数组的形式存储在m_vmapData中,或者以JSON对象数组的形式存储在m_vJsonData中。图4B为m_vmapData对应的内存结构示意图,如图4B所示,m_vmapData中可以包括多个map(图中示例性示出了Map1、Map2、Mapn),每个map中可以包括多个键值对(图中示例性示出了Key1/Value1、Key2/Value2、Keyn/Valuen)。对于需要进行批量数据交互的接口子类,在基类的genDataMap纯虚函数的过程中,可以根据需要调用基类的PushMap或者PushJson宏指令,将的多个map数据压入基类的m_vmapData中,或者将多个JSON对象压入基类的m_vJsonData中。
继续参见图4A,基类61还实现了一个主流程函数,该主流程函数包括如下步骤S611至步骤S614:
步骤S611,对系统、接口进行初始化;
步骤S612,调用纯虚函数genDataMap;
步骤S613,从数据容器中获取数据,并调用JSON序列化方法;
这里,可以根据接口子类进行数据交互的字段中是否有嵌套JSON对象的类型,从不同的数据容器中获取数据,以将每一变量的变量名和取值一一对应,也即将接口字段和字段值绑定,并调用JSON序列化方法对每一变量的变量名和取值进行序列化处理,得到序列化处理后的数据。
图4C为本申请实施例提供的一种从数据容器中获取数据调用JSON序列化方法的实现流程示意图,如图4C所示,该流程包括如下步骤S621至步骤S623:
步骤S621,判断接口子类的类型;在接口子类为简单JSON类型的情况下,进入步骤S622,在接口子类为嵌套JSON类型的情况下,进入步骤S623;
这里,可以根据接口子类进行数据交互的字段中是否有嵌套JSON对象的类型,将接口子类分为简单JSON类型和嵌套JSON类型,简单JSON类型的接口子类进行数据交互的字段中没有嵌套JSON对象的类型,嵌套JSON类型的接口子类进行数据交互的字段中有嵌套JSON对象的类型。
在实施时,可以根据接口子类调用的宏指令来确定接口子类的类型。如果接口子类调用了宏指令PushMap,则确定接口子类为简单JSON类型;如果接口子类调用了宏指令PushJson,则确定接口子类为嵌套JSON类型。在实施时,由于PushMap指令中执行了m_dataFormat=MAP_FORMAT语句,PushJson指令中执行了m_dataFormat=JSON_FORMAT语句,因此,可以根据m_dataFormat的取值来判断接口子类的类型,在m_dataFormat的取值为MAP_FORMAT的情况下,可以确定接口子类为简单JSON类型;在m_dataFormat的取值为JSON_FORMAT的情况下,可以确定接口子类为嵌套JSON类型。
步骤S622,从m_vmapData中获取数据,并调用JSON序列化方法;
这里,在接口子类为简单JSON类型的情况下,从m_vmapData中获取数据,并调用JSON序列化方法。在实施时,可以通过循环遍历m_vmapData,从m_vmapData中取出每一组map,再循环遍历map,得到map中的每一个key/value键值对,然后把key/value键值对中的key做为JSON对象的key,value做为JSON对象的value,从而得到至少一个赋值后的JSON对象,最后再调用JSON序列化方法序列化每一JSON对象。
图4D为本申请实施例提供的一种从m_vmapData中获取数据并调用JSON序列化方法的实现流程示意图,该流程包括如下步骤S631至步骤S636:
步骤S631,从m_vmapData中取出一个map;
步骤S632,从当前map中取出一对key/value;
步骤S633,JSON对象[key]=value;
步骤S634,判断当前map中是否还有key;若是,回到步骤S632;若否,进入步骤S635;
步骤S635,序列化JSON对象;
步骤S636,判断m_vmapData中是否还有map;若是,回到步骤S631;若否,结束。
步骤S623,从m_vJsonData中获取数据,并调用JSON序列化方法。
这里,在接口子类为嵌套JSON类型的情况下,从m_vJsonData中获取数据,并调用JSON序列化方法。在实施时,可以通过循环遍历,从m_vJsonData中取出每一个JSON对象,然后调用JSON序列化方法序列化每一JSON对象。
图4E为本申请实施例提供的一种从m_vJsonData中获取数据并调用JSON序列化方法的实现流程示意图,该流程包括如下步骤S641至步骤S643:
步骤S641,从m_vJsonData中取出JSON对象;
步骤S642,序列化JSON对象;
步骤S643,判断m_vJsonData中是否还有JSON对象;若是,回到步骤S641;若否,结束。
由于宏指令varName(x)可以取得变量名对应的字符串,map、JSON对象以及vector的设计可以将这个字符串做为key,将对应的变量的取值做为value。从而调用纯虚函数genDataMap,以及从数据容器中获取数据的过程自动实现了接口字段名和变量值的绑定。
步骤S614,请求/响应第二服务。
这里,请求/响应第二服务是第一服务与第二服务之间进行通信的过程。在实施时,可以根据实际场景采用预先约定的通信方式。本申请实施例中将请求/响应第二服务的过程放在基类中实现,从而每个接口子类不需要再单独实现与第二服务进行通信的通信模块。
继续参见图4A,接口子类62还可以根据实际情况,获取所有接口字段的取值,并调用基类61的主流程函数,以实现接口子类62的实例的序列化。假设需要获取n个字段,则可以通过实现n个字段的取值方法来获取该n个字段的取值,例如,可以在接口子类中定义n个变量来存储该n个字段的取值,分别记为v1,v2,……vn,可以通过实现各字段的取值方法getKey1()、getKey2()、……getKeyn()来分别得到v1,v2,……vn的取值。
在一些实施例中,可以使用基类+接口子类的框架之外的方式来实现数据交互接口,只要实现本申请实施例涉及到的思想:使用宏定义实现一定程度的反射,通过反射将变量值和字段名做一一绑定,将实现的步骤封装成函数进行调用,也能一定程度上减少接口开发过程中的重复工作量,简化开发步骤。
在一些实施例中,可以使用宏指令之外的方式实现基类自动获取接口子类的成员变量。例如,可以由基类提供一个注册方法,将接口子类所有的成员变量名注册至基类,并在注册的同时将变量名和变量值绑定,从而基类可以自动获取接口子类成员变量的变量名和变量值。
本申请实施例至少具有以下有益效果:1)通过特定的宏指令在C++中实现了反射机制,使得基类可以方便地获取接口子类所有的成员变量,并且对接口子类的正常开发流程侵入较低,接口子类只需要关注接口所有字段值的获取,再调用宏指令实现基类的一个纯虚函数,便可快速完成整个接口子类开发;2)基于实现的反射机制,基类自动实现了接口字段key与接口子类成员变量值之间的绑定;3)所有JSON对象赋值,JSON序列化过程都由基类统一实现,从而开发一个新的接口子类,只需要关注接口字段值如何获取,无需再进行JSON对象赋值、JSON序列化等重复、易出错的工作。
基于前述的实施例,本申请实施例提供一种数据序列化装置,该装置包括所包括的各模块、以及各模块所包括的各子模块,可以通过数据序列化设备中的处理器来实现;当然也可通过具体的逻辑电路实现;在实施的过程中,处理器可以为中央处理器(CPU)、微处理器(MPU)、数字信号处理器(DSP)或现场可编程门阵列(FPGA)等。
图5为本申请实施例提供的一种数据序列化装置的组成结构示意图,如图所示,所述装置700包括获取模块701和序列化模块702,其中:
获取模块701,用于获取预设类的实例的至少一个成员变量;
序列化模块702,用于利用所述实例调用在所述预设类的基类中定义的序列化函数;其中,在所述序列化函数被调用的过程中执行以下步骤:调用在所述基类中声明并在所述预设类中定义的变量存储函数;其中,所述变量存储函数用于获取每一所述成员变量的变量名和取值,并对每一所述成员变量的变量名和取值进行关联存储,每一所述成员变量的变量名是基于自定义的反射机制确定的;基于关联存储的每一所述成员变量的变量名和取值,进行序列化处理,得到序列化处理后的数据。
在一些实施例中,所述自定义的反射机制是利用所述基类中定义的宏指令实现的,每一所述成员变量的变量名是在所述第一服务的应用程序的编译阶段通过展开所述宏指令得到的。
在一些实施例中,所述装置应用于第一服务中,所述获取模块还用于:在确定需要将所述实例发送至第二服务的情况下,获取所述实例的至少一个成员变量;所述序列化函数被调用的过程中还执行以下步骤:将所述序列化处理后的数据发送给所述第二服务。
在一些实施例中,所述装置还包括:确定模块,用于在所述实例的数据发送函数被调用的情况下,确定需要将所述实例发送至第二服务;其中,所述实例的数据发送函数用于将所述实例以序列化格式发送至第二服务;所述获取模块还用于:响应于对所述实例的数据发送函数的调用操作,获取所述实例的至少一个成员变量。
在一些实施例中,所述序列化模块还用于:在调用所述序列化函数的过程中还执行以下步骤:基于关联存储的每一所述成员变量的变量名和取值,确定与设定的序列化格式匹配的序列化对象;基于所述序列化格式,对所述序列化对象进行序列化处理,得到序列化处理后的数据。
在一些实施例中,所述序列化模块还用于:在调用所述序列化函数的过程中还执行以下步骤:获取每一所述成员变量的变量名和取值;将每一所述成员变量的变量名和取值以键值对的形式存储至数据容器中。
在一些实施例中,所述至少一个成员变量包括多组成员变量,所述序列化模块还用于:在调用所述序列化函数的过程中还执行以下步骤:以键值对的形式,将每一所述成员变量的变量名和取值按组存储至数据容器中;其中,所述数据容器中的每一元素包括一组成员变量的变量名和取值。
在一些实施例中,所述变量存储函数包括第一变量存储函数,所述数据容器包括第一数据容器,所述第一数据容器中的每一元素为键值对集合;所述序列化模块还用于:调用所述第一变量存储函数,所述第一变量存储函数被调用的过程中执行以下步骤:获取每一所述成员变量的变量名和取值;将每一所述成员变量的变量名和取值以键值对的形式存储至键值对集合中;将所述键值对集合存储至所述第一数据容器中。
在一些实施例中,所述序列化模块还用于:在调用所述第一变量存储函数的过程中还执行以下步骤:将实例类型标识设置为第一类型;在调用所述序列化函数的过程中还执行以下步骤:在确定所述实例类型标识为第一类型的情况下,对所述第一数据容器中的元素进行遍历,得到至少一个键值对集合;针对每一所述键值对集合,基于所述键值对集合中的每一所述成员变量的变量名和取值,确定与设定的序列化格式匹配的序列化对象;基于所述序列化格式,对每一所述序列化对象进行序列化处理,得到序列化处理后的数据。
在一些实施例中,所述变量存储函数包括第二变量存储函数,所述数据容器包括第二数据容器,所述第二数据容器中的每一元素为与设定的序列化格式匹配的序列化对象;所述序列化模块还用于:调用所述第二变量存储函数,所述第二变量存储函数被调用的过程中执行以下步骤:获取每一所述成员变量的变量名和取值;获取与所述序列化格式匹配的序列化对象;将每一所述成员变量的变量名和取值以键值对的形式存储至所述序列化对象中;将所述序列化对象存储至所述第二数据容器中。
在一些实施例中,所述序列化模块还用于:在调用所述第二变量存储函数的过程中还执行以下步骤:将实例类型标识设置为第二类型;在调用所述序列化函数的过程中还执行以下步骤:在确定所述实例类型标识为第二类型的情况下,对所述第二数据容器中的元素进行遍历,得到至少一个与所述序列化格式匹配的序列化对象;基于所述序列化格式,对每一所述序列化对象进行序列化处理,得到序列化处理后的数据。
在一些实施例中,所述序列化格式包括以下至少之一:JSON格式、XML格式。
以上装置实施例的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果。对于本申请装置实施例中未披露的技术细节,请参照本申请方法实施例的描述而理解。
需要说明的是,本申请实施例中,如果以软件功能模块的形式实现上述的数据序列化方法,并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请实施例的技术方案本质上或者说对相关技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台数据序列化设备(可以是服务器、或者网络设备等)执行本申请各个实施例所述方法的全部或部分。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read OnlyMemory,ROM)、磁碟或者光盘等各种可以存储程序代码的介质。这样,本申请实施例不限制于任何特定的硬件和软件结合。
对应地,本申请实施例提供一种数据序列化设备,包括存储器和处理器所述存储器存储有可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述方法中的步骤。
对应地,本申请实施例提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述方法中的步骤。
这里需要指出的是:以上存储介质和设备实施例的描述,与上述方法实施例的描述是类似的,具有同方法实施例相似的有益效果。对于本申请存储介质和设备实施例中未披露的技术细节,请参照本申请方法实施例的描述而理解。
需要说明的是,图6为本申请实施例中数据序列化设备的一种硬件实体示意图,如图6所示,该数据序列化设备800的硬件实体包括:处理器801、通信接口802和存储器803,其中
处理器801通常控制数据序列化设备800的总体操作。
通信接口802可以使数据序列化设备通过网络与其他终端或服务器通信。
存储器803配置为存储由处理器801可执行的指令和应用,还可以缓存待处理器801以及数据序列化设备80中各模块待处理或已经处理的数据(例如,图像数据、音频数据、语音通信数据和视频通信数据),可以通过闪存(FLASH)或随机访问存储器(Random AccessMemory,RAM)实现。
应理解,说明书通篇中提到的“一个实施例”或“一实施例”意味着与实施例有关的特定特征、结构或特性包括在本申请的至少一个实施例中。因此,在整个说明书各处出现的“在一个实施例中”或“在一实施例中”未必一定指相同的实施例。此外,这些特定的特征、结构或特性可以任意适合的方式结合在一个或多个实施例中。应理解,在本申请的各种实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本申请实施例的实施过程构成任何限定。上述本申请实施例序号仅仅为了描述,不代表实施例的优劣。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者装置不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者装置所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者装置中还存在另外的相同要素。
在本申请所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。以上所描述的设备实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,如:多个单元或组件可以结合,或可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的各组成部分相互之间的耦合、或直接耦合、或通信连接可以是通过一些接口,设备或单元的间接耦合或通信连接,可以是电性的、机械的或其它形式的。
上述作为分离部件说明的单元可以是、或也可以不是物理上分开的,作为单元显示的部件可以是、或也可以不是物理单元;既可以位于一个地方,也可以分布到多个网络单元上;可以根据实际的需要选择其中的部分或全部单元来实现本实施例方案的目的。
另外,在本申请各实施例中的各功能单元可以全部集成在一个处理单元中,也可以是各单元分别单独作为一个单元,也可以两个或两个以上单元集成在一个单元中;上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:移动存储设备、只读存储器(Read Only Memory,ROM)、磁碟或者光盘等各种可以存储程序代码的介质。
或者,本申请上述集成的单元如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请实施例的技术方案本质上或者说对相关技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台数据序列化设备(可以是服务器、个人计算机、移动终端、或者网络设备等)执行本申请各个实施例所述方法的全部或部分。而前述的存储介质包括:移动存储设备、ROM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本申请的实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。
Claims (15)
1.一种数据序列化方法,其特征在于,所述方法包括:
获取预设类的实例的至少一个成员变量;
利用所述实例调用在所述预设类的基类中定义的序列化函数;其中,在所述序列化函数被调用的过程中执行以下步骤:
调用在所述基类中声明并在所述预设类中定义的变量存储函数;其中,所述变量存储函数用于获取每一所述成员变量的变量名和取值,并对每一所述成员变量的变量名和取值进行关联存储,每一所述成员变量的变量名是基于自定义的反射机制确定的;
基于关联存储的每一所述成员变量的变量名和取值,进行序列化处理,得到序列化处理后的数据。
2.根据权利要求1所述的方法,其特征在于,所述自定义的反射机制是利用所述基类中定义的宏指令实现的,每一所述成员变量的变量名是在所述第一服务的应用程序的编译阶段通过展开所述宏指令得到的。
3.根据权利要求1所述的方法,其特征在于,应用于第一服务中,所述获取预设类的实例的至少一个成员变量,包括:
在确定需要将所述实例发送至第二服务的情况下,获取所述实例的至少一个成员变量;
所述序列化函数被调用的过程中还执行以下步骤:
将所述序列化处理后的数据发送给所述第二服务。
4.根据权利要求3所述的方法,其特征在于,所述方法还包括:
在所述实例的数据发送函数被调用的情况下,确定需要将所述实例发送至第二服务;其中,所述实例的数据发送函数用于将所述实例以序列化格式发送至第二服务;
所述在确定需要将所述实例发送至第二服务的情况下,获取所述实例的至少一个成员变量,包括:
响应于对所述实例的数据发送函数的调用操作,获取所述实例的至少一个成员变量。
5.根据权利要求1所述的方法,其特征在于,所述基于关联存储的每一所述成员变量的变量名和取值,进行序列化处理,得到序列化处理后的数据,包括:
基于关联存储的每一所述成员变量的变量名和取值,确定与设定的序列化格式匹配的序列化对象;
基于所述序列化格式,对所述序列化对象进行序列化处理,得到序列化处理后的数据。
6.根据权利要求1所述的方法,其特征在于,所述变量存储函数被调用的过程中执行以下步骤:
获取每一所述成员变量的变量名和取值;
将每一所述成员变量的变量名和取值以键值对的形式存储至数据容器中。
7.根据权利要求6所述的方法,其特征在于,所述至少一个成员变量包括多组成员变量,所述将每一所述成员变量的变量名和取值以键值对的形式存储至数据容器中,包括:
以键值对的形式,将每一所述成员变量的变量名和取值按组存储至数据容器中;其中,所述数据容器中的每一元素包括一组成员变量的变量名和取值。
8.根据权利要求6所述的方法,其特征在于,所述变量存储函数包括第一变量存储函数,所述数据容器包括第一数据容器,所述第一数据容器中的每一元素为键值对集合,所述第一变量存储函数被调用的过程中执行以下步骤:
获取每一所述成员变量的变量名和取值;
将每一所述成员变量的变量名和取值以键值对的形式存储至键值对集合中;
将所述键值对集合存储至所述第一数据容器中。
9.根据权利要求8所述的方法,其特征在于,所述第一变量存储函数被调用的过程中还执行以下步骤:
将实例类型标识设置为第一类型;
所述基于关联存储的每一所述成员变量的变量名和取值,进行序列化处理,得到序列化处理后的数据,包括:
在确定所述实例类型标识为第一类型的情况下,对所述第一数据容器中的元素进行遍历,得到至少一个键值对集合;
针对每一所述键值对集合,基于所述键值对集合中的每一所述成员变量的变量名和取值,确定与设定的序列化格式匹配的序列化对象;
基于所述序列化格式,对每一所述序列化对象进行序列化处理,得到序列化处理后的数据。
10.根据权利要求6所述的方法,其特征在于,所述变量存储函数包括第二变量存储函数,所述数据容器包括第二数据容器,所述第二数据容器中的每一元素为与设定的序列化格式匹配的序列化对象,所述第二变量存储函数被调用的过程中执行以下步骤:
获取每一所述成员变量的变量名和取值;
获取与所述序列化格式匹配的序列化对象;
将每一所述成员变量的变量名和取值以键值对的形式存储至所述序列化对象中;
将所述序列化对象存储至所述第二数据容器中。
11.根据权利要求10所述的方法,其特征在于,所述第二变量存储函数被调用的过程中还执行以下步骤:
将实例类型标识设置为第二类型;
所述基于关联存储的每一所述成员变量的变量名和取值,进行序列化处理,得到序列化处理后的数据,包括:
在确定所述实例类型标识为第二类型的情况下,对所述第二数据容器中的元素进行遍历,得到至少一个与所述序列化格式匹配的序列化对象;
基于所述序列化格式,对每一所述序列化对象进行序列化处理,得到序列化处理后的数据。
12.根据权利要求3、4、8至10中任一项所述的方法,其特征在于,所述序列化格式包括以下至少之一:JSON格式、XML格式。
13.一种数据序列化装置,其特征在于,所述装置包括:
获取模块,用于获取预设类的实例的至少一个成员变量;
序列化模块,用于利用所述实例调用在所述预设类的基类中定义的序列化函数;其中,在所述序列化函数被调用的过程中执行以下步骤:调用在所述基类中声明并在所述预设类中定义的变量存储函数;其中,所述变量存储函数用于获取每一所述成员变量的变量名和取值,并对每一所述成员变量的变量名和取值进行关联存储,每一所述成员变量的变量名是基于自定义的反射机制确定的;基于关联存储的每一所述成员变量的变量名和取值,进行序列化处理,得到序列化处理后的数据。
14.一种数据序列化设备,包括存储器和处理器,所述存储器存储有可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现权利要求1至12任一项所述方法中的步骤。
15.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该计算机程序被处理器执行时实现权利要求1至12任一项所述方法中的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110624032.9A CN113326032A (zh) | 2021-06-04 | 2021-06-04 | 一种数据序列化方法及装置、设备、存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110624032.9A CN113326032A (zh) | 2021-06-04 | 2021-06-04 | 一种数据序列化方法及装置、设备、存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113326032A true CN113326032A (zh) | 2021-08-31 |
Family
ID=77419685
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110624032.9A Pending CN113326032A (zh) | 2021-06-04 | 2021-06-04 | 一种数据序列化方法及装置、设备、存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113326032A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2024045382A1 (zh) * | 2022-08-31 | 2024-03-07 | 蚂蚁区块链科技(上海)有限公司 | 区块链中实现反射机制 |
Citations (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101944105A (zh) * | 2010-08-30 | 2011-01-12 | 中国测绘科学研究院 | 一种地物属性数据的处理方法 |
CN105739970A (zh) * | 2016-01-20 | 2016-07-06 | 北京京东尚科信息技术有限公司 | 数据映射为自定义类对象的方法和装置 |
CN108399068A (zh) * | 2018-03-02 | 2018-08-14 | 上海赞控网络科技有限公司 | 函数程序持久化的方法、电子设备及存储介质 |
CN108628635A (zh) * | 2018-05-07 | 2018-10-09 | 广州视源电子科技股份有限公司 | 获取参数名和局部变量名的方法、装置、设备及存储介质 |
CN109361953A (zh) * | 2018-09-18 | 2019-02-19 | 武汉斗鱼网络科技有限公司 | 弹幕消息的动态分发方法、装置、设备和存储介质 |
CN109408569A (zh) * | 2018-09-28 | 2019-03-01 | 平安科技(深圳)有限公司 | Json数据转换方法、装置、计算机设备及存储介质 |
CN109460219A (zh) * | 2018-09-28 | 2019-03-12 | 西南电子技术研究所(中国电子科技集团公司第十研究所) | 快速序列化接口控制文件的方法 |
CN109491727A (zh) * | 2018-10-16 | 2019-03-19 | 深圳壹账通智能科技有限公司 | 对象序列化方法、终端设备及计算机可读存储介质 |
CN110147413A (zh) * | 2019-04-26 | 2019-08-20 | 平安科技(深圳)有限公司 | 数据存储方法、数据查询方法、装置、设备及存储介质 |
CN110275789A (zh) * | 2019-06-24 | 2019-09-24 | 恒生电子股份有限公司 | 数据处理方法及装置 |
CN110275836A (zh) * | 2019-06-27 | 2019-09-24 | 深圳市腾讯信息技术有限公司 | 虚幻引擎应用的安全测试方法、装置及存储介质 |
CN111241346A (zh) * | 2020-01-15 | 2020-06-05 | 上海依图网络科技有限公司 | 一种对象序列化方法、装置、机器可读介质以及系统 |
-
2021
- 2021-06-04 CN CN202110624032.9A patent/CN113326032A/zh active Pending
Patent Citations (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101944105A (zh) * | 2010-08-30 | 2011-01-12 | 中国测绘科学研究院 | 一种地物属性数据的处理方法 |
CN105739970A (zh) * | 2016-01-20 | 2016-07-06 | 北京京东尚科信息技术有限公司 | 数据映射为自定义类对象的方法和装置 |
CN108399068A (zh) * | 2018-03-02 | 2018-08-14 | 上海赞控网络科技有限公司 | 函数程序持久化的方法、电子设备及存储介质 |
CN108628635A (zh) * | 2018-05-07 | 2018-10-09 | 广州视源电子科技股份有限公司 | 获取参数名和局部变量名的方法、装置、设备及存储介质 |
CN109361953A (zh) * | 2018-09-18 | 2019-02-19 | 武汉斗鱼网络科技有限公司 | 弹幕消息的动态分发方法、装置、设备和存储介质 |
CN109460219A (zh) * | 2018-09-28 | 2019-03-12 | 西南电子技术研究所(中国电子科技集团公司第十研究所) | 快速序列化接口控制文件的方法 |
CN109408569A (zh) * | 2018-09-28 | 2019-03-01 | 平安科技(深圳)有限公司 | Json数据转换方法、装置、计算机设备及存储介质 |
CN109491727A (zh) * | 2018-10-16 | 2019-03-19 | 深圳壹账通智能科技有限公司 | 对象序列化方法、终端设备及计算机可读存储介质 |
CN110147413A (zh) * | 2019-04-26 | 2019-08-20 | 平安科技(深圳)有限公司 | 数据存储方法、数据查询方法、装置、设备及存储介质 |
WO2020215558A1 (zh) * | 2019-04-26 | 2020-10-29 | 平安科技(深圳)有限公司 | 数据存储方法、数据查询方法、装置、设备及存储介质 |
CN110275789A (zh) * | 2019-06-24 | 2019-09-24 | 恒生电子股份有限公司 | 数据处理方法及装置 |
CN110275836A (zh) * | 2019-06-27 | 2019-09-24 | 深圳市腾讯信息技术有限公司 | 虚幻引擎应用的安全测试方法、装置及存储介质 |
CN111241346A (zh) * | 2020-01-15 | 2020-06-05 | 上海依图网络科技有限公司 | 一种对象序列化方法、装置、机器可读介质以及系统 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2024045382A1 (zh) * | 2022-08-31 | 2024-03-07 | 蚂蚁区块链科技(上海)有限公司 | 区块链中实现反射机制 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
WO2022199111A1 (zh) | 应用程序中功能的实现方法、装置、电子设备和存储介质 | |
CN110009321B (zh) | 一种基于区块链智能合约的转账方法及系统 | |
CN112256321A (zh) | 静态库打包方法、装置、计算机设备和存储介质 | |
CN108376066B (zh) | 代码处理装置及代码处理方法 | |
CN111399840A (zh) | 一种模块开发方法及装置 | |
US20220326981A1 (en) | Systemic extensible blockchain object model comprising a first-class object model and a distributed ledger technology | |
US11893367B2 (en) | Source code conversion from application program interface to policy document | |
CN110046991B (zh) | 一种基于区块链智能合约的数据处理方法及系统 | |
CN113326032A (zh) | 一种数据序列化方法及装置、设备、存储介质 | |
CN115934093A (zh) | 小程序跨端应用方法、相关装置及计算机存储介质 | |
CN109857450B (zh) | 一种校验服务编排方法及装置 | |
CN111159033B (zh) | 一种软件测试方法及装置 | |
US20160196119A1 (en) | Apparatus and Methods for Virtual and Interface Method Calls | |
CN111324395B (zh) | 调用方法、装置和计算机可读存储介质 | |
CN114285859B (zh) | 中间层区块链服务的数据处理方法、装置、设备及存储介质 | |
CN116414689A (zh) | 一种基于反射机制的接口参数校验方法及系统 | |
CN117971350A (zh) | 小程序运行方法、装置和计算机可读存储介质 | |
CN115629976A (zh) | 一种内核测试方法、装置和存储介质 | |
CN115357282A (zh) | 应用实现方法、装置、电子设备及存储介质 | |
CN113656009A (zh) | 一种宏处理方法、装置、电子设备及存储介质 | |
CN114020498A (zh) | 不同部署场景的远程调用方法、装置、设备及存储介质 | |
CN112232027A (zh) | 一种符号翻译方法、装置、设备和计算机可读存储介质 | |
CN117056317B (zh) | 数据处理方法、装置、设备及计算机可读存储介质 | |
US20230359440A1 (en) | Externally-initiated runtime type extension | |
CN115827140B (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 |