CN106775638B - 一种对象序列化方法、装置和计算设备 - Google Patents

一种对象序列化方法、装置和计算设备 Download PDF

Info

Publication number
CN106775638B
CN106775638B CN201611036368.9A CN201611036368A CN106775638B CN 106775638 B CN106775638 B CN 106775638B CN 201611036368 A CN201611036368 A CN 201611036368A CN 106775638 B CN106775638 B CN 106775638B
Authority
CN
China
Prior art keywords
serialization
attribute
attribute value
bit
result
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
CN201611036368.9A
Other languages
English (en)
Other versions
CN106775638A (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.)
Beijing Pierbulaini Software Co ltd
Original Assignee
Beijing Pierbulaini Software Co ltd
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 Beijing Pierbulaini Software Co ltd filed Critical Beijing Pierbulaini Software Co ltd
Priority to CN201611036368.9A priority Critical patent/CN106775638B/zh
Publication of CN106775638A publication Critical patent/CN106775638A/zh
Application granted granted Critical
Publication of CN106775638B publication Critical patent/CN106775638B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4488Object-oriented

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种对象序列化方法,在计算设备中执行,所述对象具有一个或多个属性,该方法包括:依次获取对象中各属性的属性信息,属性信息包括数据类型、属性名和属性值;根据各属性的属性信息来确定整体缓冲区的预估容量,所述整体缓冲区适于缓存对象序列化的结果;向操作系统请求具有预估容量的整体缓冲区;依次根据各属性的数据类型对各属性进行序列化,将序列化后的结果写入整体缓冲区。本发明还公开了能够实施上述对象序列化方法的对象序列化装置,和包括上述装置的计算设备。

Description

一种对象序列化方法、装置和计算设备
技术领域
本发明涉及计算机技术领域,尤其涉及一种对象序列化方法、装置和计算设备。
背景技术
序列化(Serialization)是一种将对象的状态信息转换为可以存储或传输的形式的过程。在该过程中,首先将序列化的结果写入缓冲区,再将缓冲区中的内容输出或写入磁盘。基于目前的应用场景,序列化的转换形式主要包括Json、Xml、Binary等。在云计算及高性能计算领域,序列化的性能通常会对系统的计算性能造成很大的影响。
现有的序列化方案多采用系统的原始API,而在系统的序列化API中,数据无法直接写入到缓冲区,而是要先在缓冲区之外再分配一个小容量的临时缓冲区,在该临时缓冲区中将数据转换成一个新的字符串对象,然后再将该字符串对象从临时缓冲区拷贝至缓冲区(如图1所示)。该方法会频繁地生成新对象,并在使用完毕后立即销毁,加重了垃圾回收(GC,Garbage Collection)的负担,降低了系统性能。
现有的序列化方法中,往往采用多次分配扩容的内存分配方式,即,首先为序列化分配一块内存作为序列化的缓冲区,在执行序列化的过程中,当缓冲区空间不够时,重新申请一块更大的内存作为新的缓冲区,将之前已写入旧缓冲区的数据拷贝到新缓冲区中,然后释放旧缓冲区中的数据,由系统对旧的缓冲区进行垃圾回收。该方法需要多次申请内存,增加了系统进行垃圾回收的负担。由于申请内存时需要连续的空间,该方法也增加了系统进行内存整理的频率。此外,该方法需要频繁地进行缓冲区边界检查、数据拷贝和迁移,消耗了大量的CPU资源。
在进行序列化时,针对不同的数据类型,需要不同的序列化方法。现有的序列化方法多采用多条件分支判断来实现不同类型数据的序列化:首先采用反射机制获取对象(Object)中某个属性的属性值,采用反射机制获取的属性值仍是一个对象。随后,需要采用GetType()来获取该属性值的数据类型,接下来对该属性值的数据类型进行多条件分支判断,从而采用合适的序列化方法来对该属性值进行序列化(如图2所示)。该方法中,反射机制需要消耗较多的系统资源和处理时间,通过反射机制来获取属性值的数据类型效率较低。此外,在面向对象的语言中数据类型可知的情况下,该方法中的多条件分支相当于做了大量的无效判断,大大降低了序列化的处理性能。
发明内容
为此,本发明提供一种对象序列化方法、装置和计算设备,以力图解决或至少缓解上面存在的问题。
根据本发明的一个方面,提供一种对象序列化方法,在计算设备中执行,所述对象具有一个或多个属性,所述方法包括:依次获取对象中各属性的属性信息,所述属性信息包括数据类型、属性名和属性值;根据各属性的属性信息来确定整体缓冲区的预估容量,所述整体缓冲区适于缓存所述对象序列化的结果;向操作系统请求具有所述预估容量的整体缓冲区;依次根据各属性的数据类型对各属性进行序列化,将序列化后的结果写入整体缓冲区。
可选地,在根据本发明的对象序列化方法中,根据各属性的属性信息来确定整体缓冲区的预估容量的步骤包括:确定所述对象的所有属性名所占用的总字节数;预估所述对象的所有属性值的序列化结果所占用的总字节数;确定对象序列化结果中分隔符、标识符所占用的总字节数;将上述总字节数之和作为整体缓冲区的预估容量。
可选地,在根据本发明的对象序列化方法中,按照以下步骤预估所述对象的各属性值的序列化结果所占用的字节数:对于所占用的存储空间固定的数据类型,将该数据类型的数据的序列化结果所能占用的最大字节数作为具有该数据类型的属性值的序列化结果所占用的字节数;对于所占用的存储空间不固定但是能够获取属性值长度的数据类型,获取该属性值的长度,根据所述长度来确定该属性值的序列化结果所占用的字节数。
可选地,在根据本发明的对象序列化方法中,依次根据各属性的数据类型对各属性进行序列化,将序列化后的结果写入整体缓冲区的步骤包括:对于每个属性,将标识符、属性名、分隔符写入整体缓冲区;根据该属性的数据类型对属性值进行序列化,将序列化结果写入整体缓冲区。
可选地,在根据本发明的对象序列化方法中,根据该属性的数据类型对属性值进行序列化的步骤包括:通过动态编译获取该属性的数据类型,根据所获取的数据类型调用相应的序列化方法对该属性值进行序列化。
可选地,在根据本发明的对象序列化方法中,当数据类型为整数类型时,所述根据该属性的数据类型对属性值进行序列化,将序列化结果写入整体缓冲区的步骤包括:若属性值小于预设的阈值,则按照从高位到低位的顺序依次序列化所述属性值的每一位数据,将每一位数据的序列化结果依次写入整体缓冲区的固定区域,所述固定区域为从分隔符后第一个字节开始的、长度为该类型数据的序列化结果所能占用的最大字节数的区域,其中,将属性值的最高位数据的序列化结果写入固定区域的第一位,将属性值的次高位数据的序列化结果写入固定区域的第二位,以此类推;若属性值大于等于所述阈值,则按照从低位到高位的顺序依次序列化所述属性值的每一位数据,将每一位数据的序列化结果依次写入整体缓冲区的固定区域,其中,将属性值的最低位数据的序列化结果写入固定区域的最后一位,将属性值的次低位数据的序列化结果写入固定区域的倒数第二位,以此类推;在属性值的序列化结果全部写入固定区域后,将属性值的序列化结果移至固定区域的最前端。
可选地,在根据本发明的对象序列化方法中,采用指针来执行所述写入的步骤。
可选地,在根据本发明的对象序列化方法中,在完成对象序列化之后,对所述整体缓冲区进行回收以实现缓冲区重用。
可选地,在根据本发明的对象序列化方法中,在所述向操作系统请求具有所述预估容量的整体缓冲区的步骤之前,还包括:判断现有的缓冲区中是否存在容量大于等于所述预估容量的缓冲区;若是,则将该容量大于等于所述预估容量的缓冲区作为本次对象序列化的整体缓冲区;若否,则向操作系统请求具有所述预估容量的整体缓冲区。
根据本发明的一个方面,提供一种对象序列化装置,驻留于计算设备中,其中,所述对象具有一个或多个属性,所述装置包括:信息获取模块,适于依次获取对象中各属性的属性信息,所述属性信息包括数据类型、属性名和属性值;容量预估模块,适于根据各属性的属性信息来确定整体缓冲区的预估容量,所述整体缓冲区适于缓存所述对象序列化的结果;缓冲区请求模块,适于向操作系统请求具有所述预估容量的整体缓冲区;序列化模块,适于依次根据各属性的类型对各属性进行序列化,将序列化后的结果写入整体缓冲区。
根据本发明的一个方面,提供一种计算设备,包括如上所述的对象序列化装置。
根据本发明的技术方案,根据对象中各属性的属性信息来预估整体缓冲区的容量,一次性申请内存,避免了多次生成新对象并抛弃以及对缓冲区进行多次扩容所造成的性能消耗。同时,这种整体缓冲区的分配方法能够保证数据的写入不会越界,因此可以直接采用指针来写入数据,避免语言框架的边界检查所造成的性能消耗。
本发明在对对象进行序列化时,采用动态编译框架,能够获取属性的数据类型,并根据数据类型调用相应的序列化方法来对该属性进行序列化。该对象序列化方法是一个顺序执行的过程,无需采用反射机制,也无需进行多条件分支判断,节省了系统资源,提高了序列化效率。
在本发明中,针对各数据类型的特点,预先生成了对不同数据类型进行序列化的方法,以提高序列化性能。例如,对于整数类型(byte、int、short、long等)的属性,当属性值较小时,直接按照从高位到低位的顺序依次序列化该属性值的每一位数据并依次写入整体缓冲区,避免了整体缓冲区中的数据移动,提高了序列化效率。
此外,本发明在完成对象序列化后,对整体缓冲区进行回收,统一管理。在为下一次对象序列化分配整体缓冲区时,优先使用已有的缓冲区进行分配,无需向操作系统重新申请内存,减少了CPU的负担。对于预估容量较大的整体缓冲区分配,该方案的性能优势体现得更为明显。
附图说明
为了实现上述以及相关目的,本文结合下面的描述和附图来描述某些说明性方面,这些方面指示了可以实践本文所公开的原理的各种方式,并且所有方面及其等效方面旨在落入所要求保护的主题的范围内。通过结合附图阅读下面的详细描述,本公开的上述以及其它目的、特征和优势将变得更加明显。遍及本公开,相同的附图标记通常指代相同的部件或元素。
图1示出了现有技术中的一种不断生成新对象的序列化方法的示意图;
图2示出了现有技术中的一种多条件分支判断的序列化方法的示意图;
图3示出了根据本发明一个实施例的计算设备300的结构图;
图4示出了根据本发明一个实施例的对象序列化装置400的结构图;
图5A-5C示出了根据本发明一个实施例的属性值序列化过程的示意图;
图6A-6B示出了根据本发明另一个实施例的属性值序列化过程的示意图;
图7示出了根据本发明另一个实施例的对象序列化装置700的结构图;
图8示出了根据本发明一个实施例的对象序列化方法800的流程图;
图9示出了根据本发明另一个实施例的对象序列化方法900的流程图;以及
图10示出了根据本发明一个实施例的对一个Student对象进行序列化的示意图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
图3示出了根据本发明一个实施例的计算设备300的结构图。在基本配置302中,计算设备300典型地包括系统存储器306和一个或者多个处理器304。存储器总线308可以用于在处理器304和系统存储器306之间的通信。
取决于期望的配置,处理器304可以是任何类型的处理,包括但不限于:微处理器(μP)、微控制器(μC)、数字信息处理器(DSP)或者它们的任何组合。处理器304可以包括诸如一级高速缓存310和二级高速缓存312之类的一个或者多个级别的高速缓存、处理器核心314和寄存器316。示例的处理器核心314可以包括运算逻辑单元(ALU)、浮点数单元(FPU)、数字信号处理核心(DSP核心)或者它们的任何组合。示例的存储器控制器318可以与处理器304一起使用,或者在一些实现中,存储器控制器318可以是处理器304的一个内部部分。
取决于期望的配置,系统存储器306可以是任意类型的存储器,包括但不限于:易失性存储器(诸如RAM)、非易失性存储器(诸如ROM、闪存等)或者它们的任何组合。系统存储器306可以包括操作系统320、一个或者多个应用322以及程序数据324。在一些实施方式中,应用322可以布置为在操作系统上利用程序数据324进行操作。
计算设备300还可以包括有助于从各种接口设备(例如,输出设备342、外设接口344和通信设备346)到基本配置302经由总线/接口控制器330的通信的接口总线340。示例的输出设备342包括图形处理单元348和音频处理单元350。它们可以被配置为有助于经由一个或者多个A/V端口352与诸如显示器或者扬声器之类的各种外部设备进行通信。示例外设接口344可以包括串行接口控制器354和并行接口控制器356,它们可以被配置为有助于经由一个或者多个I/O端口358和诸如输入设备(例如,键盘、鼠标、笔、语音输入设备、触摸输入设备)或者其他外设(例如打印机、扫描仪等)之类的外部设备进行通信。示例的通信设备346可以包括网络控制器360,其可以被布置为便于经由一个或者多个通信端口364与一个或者多个其他计算设备362通过网络通信链路的通信。
网络通信链路可以是通信介质的一个示例。通信介质通常可以体现为在诸如载波或者其他传输机制之类的调制数据信号中的计算机可读指令、数据结构、程序模块,并且可以包括任何信息递送介质。“调制数据信号”可以这样的信号,它的数据集中的一个或者多个或者它的改变可以在信号中编码信息的方式进行。作为非限制性的示例,通信介质可以包括诸如有线网络或者专线网络之类的有线介质,以及诸如声音、射频(RF)、微波、红外(IR)或者其它无线介质在内的各种无线介质。这里使用的术语计算机可读介质可以包括存储介质和通信介质二者。
计算设备300可以实现为服务器,例如文件服务器、数据库服务器、应用程序服务器和WEB服务器等,也可以实现为包括桌面计算机和笔记本计算机配置的个人计算机。此外,计算设备300还可以实现为小尺寸便携(或者移动)电子设备的一部分,这些电子设备可以是诸如蜂窝电话、个人数字助理(PDA)、个人媒体播放器设备、无线网络浏览设备、个人头戴设备、应用专用设备、或者可以包括上面任何功能的混合设备。待测设备可以是桌面电脑、笔记本电脑、平板电脑、手机等具有运算能力的设备。
本发明中,计算设备300的应用322中包括对象序列化装置400,使得计算设备300能够实现高效的序列化。对象序列化装置400可以作为一个插件驻留于计算设备300的浏览器中,或作为一个独立的软件安装于计算设备300中,或作为驻留于计算设备300中的某个软件的一部分来实现对象序列化的功能,本发明对对象序列化装置400在计算设备300中的存在形式不做限制。
图4示出了根据本发明一个实施例的对象序列化装置400的结构图。如图4所示,对象序列化装置400包括信息获取模块410、容量预估模块420、缓存区请求模块430和序列化模块440。
信息获取模块410适于依次获取对象中各属性的属性信息,其中,“依次”指的是按照属性在对象中出现的顺序依次获取对象中的属性信息,即首先获取对象中出现的第一个属性的属性信息,再获取对象中出现的第二个属性的属性信息,以此类推。属性信息包括数据类型、属性名和属性值。例如,对象中有一个属性int age=18,对于该属性,其数据类型为int,属性名为age,属性值为18。
信息获取模块410获取了对象中各属性的属性信息后,容量预估模块420根据各属性的属性信息来确定整体缓冲区的预估容量。整体缓冲区用于缓存该对象序列化的结果,在对象序列化完成后,可以根据需要将整体缓冲区中的内容输出或存入磁盘。
JSON是比较常用的序列化目标格式。JSON格式的对象序列化结果是一个由对象中各属性的“属性名-属性值”对所构成的字符串集合。该字符串集合以左大括号({)开始,以右大括号(})结束,属性名和字符类型的属性值均需要用双引号(“”)括起来,数组类型的属性值需要用中括号([)括起来,JSON类型的属性值需要用大括号({})括起来。属性名和属性值之间使用冒号(:)分隔,各“属性名-属性值”对之间使用逗号(,)分隔。
根据一种实施例,JSON格式的序列化结果可以分为以下三部分:
1)各属性名的序列化结果。
2)各属性值的序列化结果。
3)分隔符、标识符。分隔符为属性值和属性值之间的冒号(:)和各“属性名-属性值”对之间的逗号(,),标识符为用于表示属性名和字符类型的属性值的双引号(“”)、用于表示数组类型的属性值的中括号([])和用于表示JSON类型的属性值的大括号({})。
例如,属性int age=18的序列化结果为{“Age”:18},该序列化结果包括属性名Age,属性值的序列化结果18,分隔符冒号(:),标识符大括号({})和标识符双引号(“”)。
JSON格式的序列化结果包括以上三部分,其中,对于一个确定的对象,其包括的属性名也是确定的,且属性名均为字符串,在进行属性名的序列化时,直接将属性名拷贝至整体缓冲区中即可,整体缓冲区中各属性名所占用的总字节数即为各属性名中所包含的字符数的总和。序列化结果中分隔符的总数目也是固定的,对于一个不包含复杂数据类型(数组、JSON、Dictionary等)的对象,其分隔符数目为(2*属性个数-1),即分隔符所占用的总字节数为(2*属性个数-1);对于一个包含复杂数据类型的对象,其分隔符的数目也可以根据数据类型的具体情况计算出来。序列化结果中标识符的数目也是固定的,对于一个不包含复杂数据类型的对象,其标识符数目为(属性个数*2+非数值类型的属性个数*2+2),相应地,标识符所占用的总字节数为(属性个数*2+非数值类型的属性个数*2+2);对于一个包含复杂数据类型的对象,其标识符的数目也可以根据数据类型的具体情况计算出来。而各属性的属性值的序列化结果所占用的字节数在未进行序列化时很难确定。
因此,为了确定整体缓冲区的预估容量,容量预估模块420需要确定各属性名所占用的总字节数,分隔符、标识符所占用的总字节数,以及预估各属性值的序列化结果所占用的总字节数,并将上述总字节数之和作为整体缓冲区的预估容量。其中,预估各属性值的序列化结果所占用的总字节数是确定整体缓冲区的预估容量的关键。
根据一种实施例,在预估一个属性值的序列化结果所占用的字节数时,对于所占用的存储空间固定的数据类型,将该数据类型的数据的序列化结果所能占用的最大字节数作为该属性值的序列化结果所占用的字节数。例如,byte类型所占用的存储空间固定为1个字节,其存储的数值范围为0~255,故byte类型数据的序列化结果所能占用的最大字节数为3(以255为例,数值255的序列化结果为长度为3的字符串“255”),因此,容量估计模块420在预估整体缓冲区的容量时,将byte类型的属性值的序列化结果所占用的字节数设为3。又例如,int类型所占用的存储空间固定为4个字节,其存储的数值范围为-2147483648~2147483647,故int类型数据的序列化结果所能占用的最大字节数为11(以-2147483648为例,数值-2147483648的序列化结果为长度为11的字符串“-2147483648”),因此,容量估计模块420在预估整体缓冲区的容量时,将int类型的属性值的序列化结果所占用的字节数设为11。又例如,guid类型所占用的存储空间为16个字节,其存储的数据为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”格式,其中,每个x表示一个十六进制数,故guid类型数据的序列化结果所占用的字节数为36。同理可知,容量估计模块420在预估整体缓冲区的容量时,将sbyte类型的属性值的序列化结果所占用的字节数设为4,short类型的设为6,float类型设为16,double类型设为25,等等。
对于所占用的存储空间不固定但是能够获取属性值长度的数据类型,获取该属性值的长度,根据所述长度来确定该属性值的序列化结果所占用的字节数。例如,string类型所占用的存储空间不确定,但是可以通过length()方法来获取string类型的属性值的长度,例如,string x=“abc”,那么可以通过x.length()来获取字符串x的长度,为3,相应地,容量估计模块420将该属性值的序列化结果所占用的字节数设为3。
容量估计模块420按照上述方法预估得出各属性值的序列化结果所占用的总字节数之后,加上各属性名、分隔符、标识符所占用的总字节数,即得到整体缓冲区的预估容量。容量估计模块420根据对象中各属性的属性信息来预估整体缓冲区的容量,一次性申请内存,避免了多次生成新对象并抛弃以及对缓冲区进行多次扩容所造成的性能消耗。同时,这种整体缓冲区的分配方法能够保证数据的写入不会越界,因此,根据一种实施例,可以直接采用指针来写入数据,避免语言框架的边界检查所造成的性能消耗。
容量估计模块420确定了整体缓冲区的预估容量后,由缓冲区请求模块430向操作系统请求具有预估容量的整体缓冲区,操作系统响应于该请求将分配一块长度为预估容量的内存作为整体缓冲区。随后,由序列化模块440依次根据各属性的类型对各属性进行序列化,并将序列化后的结果写入整体缓冲区。
根据一种实施例,序列化模块440按照属性在对象中出现的顺序依次对各属性进行序列化。对于每个属性,先将标识符、属性名、分隔符写入整体缓冲区,再根据该属性的数据类型对属性值进行序列化,将序列化结果写入整体缓冲区。
在对属性值进行序列化时,不同数据类型的属性值需要不同的序列化方法。根据一种实施例,采用动态编译框架对属性值进行序列化,即预先生成好对每种数据类型的属性值进行序列化的方法调用,例如将int类型的属性值的序列化方法设为Write(int),将string类型的属性值的序列化方法设为Write(string),等等。在对某个属性值进行序列化时,首先通过动态编译获取该属性的数据类型,随后根据数据类型来调用相应的序列化方法对该属性值进行序列化。该对象序列化方法是一个顺序执行的过程,无需采用反射机制,也无需进行多条件分支判断,节省了系统资源,提高了序列化效率。
特别地,在对属性值进行序列化时,若属性值的序列化结果所占用的字节数是确定的,例如string类型的属性值,按照从该属性值的第一位到最后一位的顺序依次序列化该属性值,在将该属性值的序列化结果写入时,在整体缓冲区中的相应区域从前向后写即可。例如,对于属性string x=“abc”,其数据类型为string,在对string类型的属性值“abc”进行序列化时,如图5A所示,依次序列化a、b、c三个字符,并将a、b、c三个字符依次写入整体缓冲区。
若属性值的序列化结果所占用的字节数是预估的(即该属性值所对应的数据类型所占用的存储空间是固定的),则先在该属性名后跟的分隔符后的第一个字节开始,为该属性值的序列化结果预留一个固定区域,该固定区域的长度为该属性值的序列化结果所预估的字节数。按照从该属性值的低位到高位的顺序依次序列化该属性值,在将该属性值的序列化结果进行写入时,将序列化结果从固定区域的后端开始写入,在属性值的序列化完成后,将该属性值的序列化结果再移至固定区域的前端。例如,如图5B所示,对于属性int num=18的属性值18,在预估容量时,为一个int类型的值分配的字节数为11,因此在对该属性值进行序列化时,首先为其分配一个长度为11字节的固定区域(图5B中的灰色区域),随后从低位,即从数字8开始对其进行序列化,将数字8的序列化结果写入固定区域的最后端,随后对数字1进行序列化,将数字1的序列化结果写入固定区域的次后端,完成对属性值18的序列化后,将序列化结果(即字符串18)移至固定区域的前端。如图5C所示,对于属性intnum=123456789的属性值123456789,其序列化过程与属性值18类似,也是按照从低位到高位的顺序进行序列化,并按照从固定区域的后端到前端的顺序写入,最后再将序列化结果移动至固定区域的前端。
但是,对于18和123456789来说,图5B和图5C所示的序列化过程效率是不一样的。属性值18仅有2位数字,但在其序列化过程中每位数字均需要平移9个位置才能将其序列化结果从固定区域的后端移至前端。而实际上,由于属性值18的位数很少,直接按照从高位到低位的顺序进行序列化,并从固定区域的前端写起,可以避免整体缓冲区中的数据移动,能够明显地提高序列化效率。因此,根据一种优选的实施例,当数据类型为整数类型(例如byte、int、short、long等)时,可以按照以下步骤来对属性值进行序列化并将序列化结果写入整体缓冲区:
若属性值小于阈值,则按照从高位到低位的顺序依次序列化所述属性值的每一位数据,将每一位数据的序列化结果依次写入整体缓冲区的固定区域,所述固定区域为从分隔符后第一个字节开始的长度为该类型数据的序列化结果所能占用的最大字节数的区域,其中,将属性值的最高位数据的序列化结果写入固定区域的第一位,将属性值的次高位数据的序列化结果写入固定区域的第二位,以此类推;
若属性值大于等于阈值,则按照从低位到高位的顺序依次序列化所述属性值的每一位数据,将每一位数据的序列化结果依次写入整体缓冲区的固定区域,其中,将属性值的最低位数据的序列化结果写入固定区域的最后一位,将属性值的次低位数据的序列化结果写入固定区域的倒数第二位,以此类推;在属性值的序列化结果全部写入固定区域后,将属性值的序列化结果移至固定区域的最前端。
上述阈值的取值应为10的整数倍,且一般为一个比较小的数,例如100。当然,阈值的设置可以由本领域技术人员根据实际情况自行设置,例如,对于int类型将阈值设置为100,对于long类型将阈值设置为10000,等等,本发明对阈值的具体取值不做限制。
在采用上述优化后,例如将int类型的阈值设为100,则对于属性值18和属性值123456789,其序列化过程分别如图6A、6B所示。其中,图6A所示的小于阈值100的属性值18的序列化过程与图5B中所示不同,其序列化效率有明显提高;图6B所示的大于100的属性值123456789的序列化过程仍与图5C中所示相同。
应当指出,图6A、6B所示的优化逻辑体现在对整数类型数值的方法调用上,即体现在Write(int)、Write(long)、Write(short)等方法中。
序列化模块440完成对象中所有属性的序列化后,即完成了整个对象的序列化,这时,整体缓冲区中存储的内容即为对象序列化的结果。
图7示出了根据本发明另一个实施例的对象序列化装置700的结构图。其与图4所示的装置400相比,多了回收模块450。信息获取模块410、容量预估模块420和序列化模块440的功能和处理逻辑与在前述装置400中所述的相同,此处不再赘述。
回收模块450适于在完成对象序列化之后,对整体缓冲区进行回收以实现缓冲区重用。在为下一次对象序列化分配整体缓冲区时,缓冲区请求模块430首先在已回收的缓冲区中请求整体缓冲区,即:判断现有的缓冲区中是否存在容量大于等于所述预估容量的缓冲区;若是,则将所述缓冲区作为本次对象序列化的整体缓冲区;若否,则向操作系统请求具有所述预估容量的整体缓冲区。
回收模块450能够在完成对象序列化之后对整体缓冲区进行回收,统一管理。从而在为下一次对象序列化分配整体缓冲区时,优先使用已有的缓冲区进行分配,无需向操作系统重新申请内存,减少了CPU的负担。对于预估容量较大的整体缓冲区分配,该方案的性能优势体现得更为明显。
图8示出了根据本发明一个实施例的对象序列化方法800的流程图。如图8所示,该方法始于步骤S810。
在步骤S810中,依次获取对象中各属性的属性信息。其中,“依次”指的是按照属性在对象中出现的顺序依次获取对象中的属性信息,即首先获取对象中出现的第一个属性的属性信息,再获取对象中出现的第二个属性的属性信息,以此类推。属性信息包括数据类型、属性名和属性值。
随后,在步骤S820中,根据各属性的属性信息来确定整体缓冲区的预估容量。确定整体缓冲区的预估容量的具体步骤可以参见前述对容量预估模块420的描述,此处不再赘述。
随后,在步骤S830中,向操作系统请求具有所述预估容量的整体缓冲区。操作系统响应于该请求,将分配一块长度为预估容量的内存作为整体缓冲区。
随后,在步骤S840中,依次根据各属性的数据类型对各属性进行序列化,将序列化后的结果写入整体缓冲区。该步骤的具体过程可以参见前述对序列化模块440的描述,此处不再赘述。
图9示出了根据本发明另一个实施例的对象序列化方法900的流程图。该方法始于步骤S910。
在步骤S910中,依次获取对象中各属性的属性信息。该步骤与前述方法800中的步骤S810相同,此处不再赘述。
随后,在步骤S920中,根据各属性的属性信息来确定整体缓冲区的预估容量。该步骤与前述方法800中的步骤S820相同,此处不再赘述。
随后,在步骤S930中,判断现有的缓冲区中是否存在容量大于等于预估容量的缓冲区,若是,则执行步骤S940,将该容量大于等于预估容量的缓冲区作为本次对象序列化的整体缓冲区;若否,则执行步骤S950,向操作系统请求具有预估容量的整体缓冲区。
随后,在步骤S960中,依次根据各属性的数据类型对各属性进行序列化,将序列化后的结果写入整体缓冲区。该步骤与前述方法800中的步骤S840相同,此处不再赘述。
随后,在步骤S970中,对整体缓冲区进行回收。该步骤的具体过程可以参见前述对回收模块450的描述,此处不再赘述。
通过前述的一系列优化,本发明的对象序列化方案与现有的主流技术方案相比,对于JSON等文本类型序列化的时间性能能够提升10倍,相对于其他Json.Net等第三方Json序列化方案更是有高达20多倍的性能提升。对于二进制序列化,性能的提升会更加明显,其相对于现有的技术方案的时间性能能够提升20~30倍。
应当指出,虽然前面的描述以JSON为例,但是,本发明的对象序列化方案也可以适用于以二进制为目标格式序列化。根据本发明的目标格式为二进制的对象序列化方法的步骤与JSON目标格式的对象序列化方法类似:首先,依次获取对象中各属性的属性信息,所述属性信息包括数据类型、属性名和属性值,该步骤与JSON序列化相同。随后,根据各属性的属性信息来确定整体缓冲区的预估容量。在二进制序列化中,属性名与属性值的序列化一般分别进行,二者的序列化结果分别存储于不同的文档,因此,对于二进制序列化,在确定整体缓冲区的预估容量时,仅需预估属性值的序列化结果所占用的字节数即可。二进制下的字节数预估相对于JSON来说更为简单,属性值的序列化结果所占用的字节数与该属性值原本所占用的存储空间相同,例如,byte类型所占用的存储空间为1个字节,那么byte类型的属性值的二进制序列化结果也占1个字节;int类型所占用的存储空间为4个字节,那么int类型的属性值的二进制序列化结果也占4个字节;string类型的属性值得序列化结果所占用的字节数与该属性值的字符长度等同;datetime的二进制序列化结果占用8个字节;guid的二进制序列化结果占用16个字节,等等。在确定了整体缓冲区的预估容量后,向操作系统请求具有所述预估容量的整体缓冲区。在操作系统相应于该请求分配了整体缓冲区后,依次对各属性值进行序列化,并将序列化后的结果写入整体缓冲区。
应当指出,本发明在预估属性值的序列化结果所占用的字节数时,仅适用于所占用的存储空间固定的,或者所占用的存储空间不固定但是能够方便地获取属性值长度的数据类型。对于难以预估序列化结果所占用的字节数的数据类型,仍采用现有技术的方案,即动态分配缓冲区的方案,边序列化边扩容。例如,对于dictionary<int,int>的数据类型,其相当于一个int类型的集合,该类型的属性值的序列化结果所占用的字节数可以参照int类型的预估方法来预估,因而该类型可以适用于本发明所述的对象序列化方案。而对于dictionary<int,object>的数据类型,由于其中包含object对象,难以准确预估该属性值的序列化结果所占用的字节数,因此该属性值不适用于本发明所述的对象序列化方案,而采用现有技术中的动态扩容方案对其进行序列化。
下面结合一个JSON序列化的具体例子来说明本发明的对象序列化步骤。
定义Student类如下:
Figure BDA0001158529860000151
首先,根据各属性的属性信息来确定整体缓冲区的预估容量。属性名Number、Name、Age共占用13个字节。Number是一个int类型的属性,其属性值的序列化结果占用11个字节;Name是一个string类型的属性,其属性值的长度可以通过Length()方法确定,该属性值的序列化结果占用8个字节;Age是一个int类型的属性,其属性值的序列化结果占用11个字节,故预估属性值的序列化结果共占用11+8+11=30个字节。该对象包括三个属性,故其序列化结果中有3个冒号(:)分隔符和2个逗号(,)分隔符,共占用5个字节;该对象包括三个属性,且其中有一个属性为字符类型,故其序列化结果中有4对双引号(“”)标识符,同时,整个序列化结果用一对大括号({})所标识,故标识符共占用10个字节,故分隔符和标识符共占用5+10=15个字节。因此,整体缓冲区的预估容量为13+30+15=58个字节。
判断现有的缓冲区中是否存在容量大于等于58个字节的缓冲区,若有,则将该缓冲区作为本次对象序列化的整体缓冲区;若没有,则向操作系统请求具有所述预估容量的整体缓冲区。此处,假设现有的缓冲区中不存在容量大于等于58个字节的缓冲区,那么由操作系统来分配一块长58字节的内存作为整体缓冲区。
随后依次对各属性进行序列化,序列化过程如图10所示。首先序列化第一个属性,将标识符左大括号({)、标识符左引号(“)、属性名Number、标识符右引号(”)、分隔符冒号(:)依次写入整体缓冲区。随后对第一个属性的属性值进行序列化,该属性的数据类型为int,在整体缓冲区为其分配一个长度为11个字节的固定区域(图10中的灰色区域),假设此处将int类型的阈值设为100,由于属性值1234567>100,按照从低位到高位的顺序对属性值1234567进行序列化,并将序列化结果依次写入整体缓冲区的固定区域,其中,将属性值的最低位数据7的序列化结果写入固定区域的最后一位,将属性值的次低位数据6的序列化结果写入固定区域的倒数第二位,以此类推;在属性值的序列化结果全部写入固定区域后,将属性值的序列化结果移至固定区域的最前端,完成第一个属性的序列化。
随后,在第一个属性值的序列化结果后写入分隔符逗号(,),进行第二个属性的序列化。将标识符左引号(“)、属性名Name、标识符右引号(”)、分隔符冒号(:)依次写入整体缓冲区。随后对第二个属性的属性值进行序列化,该属性的数据类型为string,需要先写入标识符左引号(“),再依次将“somebody”中的每一个字符进行序列化并写入整体缓冲区中,最后写入标识符右引号(”),完成第二个属性的序列化。
随后,在第二个属性值的序列化结果后写入分隔符逗号(,),进行第三个属性的序列化。将标识符左引号(“)、属性名Age、标识符右引号(”)、分隔符冒号(:)依次写入整体缓冲区。随后对第三个属性的属性值进行序列化,该属性的数据类型为int,在整体缓冲区为其分配一个长度为11个字节的固定区域(图10中的灰色区域),由于属性值18<100,按照从高位到低位的顺序对属性值18进行序列化,并将序列化结果依次写入整体缓冲区的固定区域,其中,将属性值的最高位数据1的序列化结果写入固定区域的第一位,将属性值的次高位数据8的序列化结果写入固定区域的第二位,即完成第三个属性的序列化。
最后,在第三个属性值得序列化结果后写入标识符右大括号(}),完成整个对象的序列化。对于该对象,其JSON序列化结果为:
{“Number”:1234567,“Name”:“somebody”,“Age”:18}
在完成该对象的序列化后,根据实际需要将整体缓冲区中缓存的对象序列化结果输出或写入磁盘。然后回收该整体缓冲区,以实现缓冲区重用。
A6:A4或5所述的对象序列化方法,其中,当数据类型为整数类型时,所述根据该属性的数据类型对属性值进行序列化,将序列化结果写入整体缓冲区的步骤包括:
若属性值小于预设的阈值,则按照从高位到低位的顺序依次序列化所述属性值的每一位数据,将每一位数据的序列化结果依次写入整体缓冲区的固定区域,所述固定区域为从分隔符后第一个字节开始的、长度为该类型数据的序列化结果所能占用的最大字节数的区域,其中,将属性值的最高位数据的序列化结果写入固定区域的第一位,将属性值的次高位数据的序列化结果写入固定区域的第二位,以此类推;
若属性值大于等于所述阈值,则按照从低位到高位的顺序依次序列化所述属性值的每一位数据,将每一位数据的序列化结果依次写入整体缓冲区的固定区域,其中,将属性值的最低位数据的序列化结果写入固定区域的最后一位,将属性值的次低位数据的序列化结果写入固定区域的倒数第二位,以此类推;在属性值的序列化结果全部写入固定区域后,将属性值的序列化结果移至固定区域的最前端。
A7:A1-6中任一项所述的对象序列化方法,其中,采用指针来执行所述写入的步骤。
A8:A1所述的对象序列化方法,其中,在完成对象序列化之后,对所述整体缓冲区进行回收以实现缓冲区重用。
A9:A8所述的对象序列化方法,在所述向操作系统请求具有所述预估容量的整体缓冲区的步骤之前,还包括:
判断现有的缓冲区中是否存在容量大于等于所述预估容量的缓冲区;
若是,则将该容量大于等于所述预估容量的缓冲区作为本次对象序列化的整体缓冲区;
若否,则向操作系统请求具有所述预估容量的整体缓冲区。
B14:B13所述的对象序列化装置,其中,所述序列化模块适于按照以下步骤根据该属性的数据类型对属性值进行序列化:通过动态编译获取该属性的数据类型,根据所获取的数据类型调用相应的序列化方法对该属性值进行序列化。
B15:B13或14所述的对象序列化装置,其中,当数据类型为整数类型时,所述序列化模块适于按照以下步骤来根据该属性的数据类型对属性值进行序列化,将序列化结果写入整体缓冲区:
若属性值小于预设的阈值,则按照从高位到低位的顺序依次序列化所述属性值的每一位数据,将每一位数据的序列化结果依次写入整体缓冲区的固定区域,所述固定区域为从分隔符后第一个字节开始的长度为该类型数据的序列化结果所能占用的最大字节数的区域,其中,将属性值的最高位数据的序列化结果写入固定区域的第一位,将属性值的次高位数据的序列化结果写入固定区域的第二位,以此类推;
若属性值大于等于所述阈值,则按照从低位到高位的顺序依次序列化所述属性值的每一位数据,将每一位数据的序列化结果依次写入整体缓冲区的固定区域,其中,将属性值的最低位数据的序列化结果写入固定区域的最后一位,将属性值的次低位数据的序列化结果写入固定区域的倒数第二位,以此类推;在属性值的序列化结果全部写入固定区域后,将属性值的序列化结果移至固定区域的最前端。
B16:B10-15中任一项所述的对象序列化装置,其中,所述序列化模块适于采用指针来执行所述写入的步骤。
B17:B10所述的对象序列化装置,其中,还包括回收模块,适于在完成对象序列化之后,对所述整体缓冲区进行回收以实现缓冲区重用。
B18:B17所述的对象序列化装置,其中,所述缓冲区请求模块在向操作系统请求具有所述预估容量的整体缓冲区之前,还适于:
判断现有的缓冲区中是否存在容量大于等于所述预估容量的缓冲区;
若是,则将该容量大于等于所述预估容量的缓冲区作为本次对象序列化的整体缓冲区;
若否,则向操作系统请求具有所述预估容量的整体缓冲区。
在此处所提供的说明书中,算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与本发明的示例一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下被实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员应当理解在本文所公开的示例中的设备的模块或单元或组件可以布置在如该实施例中所描述的设备中,或者可替换地可以定位在与该示例中的设备不同的一个或多个设备中。前述示例中的模块可以组合为一个模块或者此外可以分成多个子模块。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
此外,所述实施例中的一些在此被描述成可以由计算机系统的处理器或者由执行所述功能的其它装置实施的方法或方法元素的组合。因此,具有用于实施所述方法或方法元素的必要指令的处理器形成用于实施该方法或方法元素的装置。此外,装置实施例的在此所述的元素是如下装置的例子:该装置用于实施由为了实施该发明的目的的元素所执行的功能。
如在此所使用的那样,除非另行规定,使用序数词“第一”、“第二”、“第三”等等来描述普通对象仅仅表示涉及类似对象的不同实例,并且并不意图暗示这样被描述的对象必须具有时间上、空间上、排序方面或者以任意其它方式的给定顺序。
尽管根据有限数量的实施例描述了本发明,但受益于上面的描述,本技术领域内的技术人员明白,在由此描述的本发明的范围内,可以设想其它实施例。此外,应当注意,本说明书中使用的语言主要是为了可读性和教导的目的而选择的,而不是为了解释或者限定本发明的主题而选择的。因此,在不偏离所附权利要求书的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。对于本发明的范围,对本发明所做的公开是说明性的,而非限制性的,本发明的范围由所附权利要求书限定。

Claims (15)

1.一种对象序列化方法,在计算设备中执行,所述对象具有一个或多个属性,序列化结果中包括分隔符、标识符,所述方法包括:
依次获取对象中各属性的属性信息,所述属性信息包括数据类型、属性名和属性值;
根据各属性的属性信息来确定整体缓冲区的预估容量,所述整体缓冲区适于缓存所述对象序列化的结果;
向操作系统请求具有所述预估容量的整体缓冲区;
对于每个属性,将标识符、属性名、分隔符写入整体缓冲区;根据该属性的数据类型对属性值进行序列化,将序列化结果写入整体缓冲区:
当数据类型为整数类型时,
若属性值小于预设的阈值,则按照从高位到低位的顺序依次序列化所述属性值的每一位数据,将每一位数据的序列化结果依次写入整体缓冲区的固定区域,所述固定区域为从分隔符后第一个字节开始的、长度为该类型数据的序列化结果所能占用的最大字节数的区域,其中,将属性值的最高位数据的序列化结果写入固定区域的第一位,将属性值的次高位数据的序列化结果写入固定区域的第二位,以此类推;
若属性值大于等于所述阈值,则按照从低位到高位的顺序依次序列化所述属性值的每一位数据,将每一位数据的序列化结果依次写入整体缓冲区的固定区域,其中,将属性值的最低位数据的序列化结果写入固定区域的最后一位,将属性值的次低位数据的序列化结果写入固定区域的倒数第二位,以此类推;在属性值的序列化结果全部写入固定区域后,将属性值的序列化结果移至固定区域的最前端。
2.如权利要求1所述的对象序列化方法,其中,所述根据各属性的属性信息来确定整体缓冲区的预估容量的步骤包括:
确定所述对象的所有属性名所占用的总字节数;
预估所述对象的所有属性值的序列化结果所占用的总字节数;
确定对象序列化结果中分隔符、标识符所占用的总字节数;
将上述总字节数之和作为整体缓冲区的预估容量。
3.如权利要求2所述的对象序列化方法,其中,按照以下步骤预估所述对象的各属性值的序列化结果所占用的字节数:
对于所占用的存储空间固定的数据类型,将该数据类型的数据的序列化结果所能占用的最大字节数作为具有该数据类型的属性值的序列化结果所占用的字节数;
对于所占用的存储空间不固定但是能够获取属性值长度的数据类型,获取该属性值的长度,根据所述长度来确定该属性值的序列化结果所占用的字节数。
4.如权利要求1所述的对象序列化方法,其中,所述根据该属性的数据类型对属性值进行序列化的步骤包括:通过动态编译获取该属性的数据类型,根据所获取的数据类型调用相应的序列化方法对该属性值进行序列化。
5.如权利要求1-4中任一项所述的对象序列化方法,其中,采用指针来执行所述写入的步骤。
6.如权利要求1所述的对象序列化方法,其中,在完成对象序列化之后,对所述整体缓冲区进行回收以实现缓冲区重用。
7.如权利要求6所述的对象序列化方法,在所述向操作系统请求具有所述预估容量的整体缓冲区的步骤之前,还包括:
判断现有的缓冲区中是否存在容量大于等于所述预估容量的缓冲区;
若是,则将该容量大于等于所述预估容量的缓冲区作为本次对象序列化的整体缓冲区;
若否,则向操作系统请求具有所述预估容量的整体缓冲区。
8.一种对象序列化装置,驻留于计算设备中,其中,所述对象具有一个或多个属性,序列化结果中包括分隔符、标识符,所述装置包括:
信息获取模块,适于依次获取对象中各属性的属性信息,所述属性信息包括数据类型、属性名和属性值;
容量预估模块,适于根据各属性的属性信息来确定整体缓冲区的预估容量,所述整体缓冲区适于缓存所述对象序列化的结果;
缓冲区请求模块,适于向操作系统请求具有所述预估容量的整体缓冲区;
序列化模块,适于对于每个属性,将标识符、属性名、分隔符写入整体缓冲区;根据该属性的数据类型对属性值进行序列化,将序列化结果写入整体缓冲区:
当数据类型为整数类型时,
若属性值小于预设的阈值,则按照从高位到低位的顺序依次序列化所述属性值的每一位数据,将每一位数据的序列化结果依次写入整体缓冲区的固定区域,所述固定区域为从分隔符后第一个字节开始的、长度为该类型数据的序列化结果所能占用的最大字节数的区域,其中,将属性值的最高位数据的序列化结果写入固定区域的第一位,将属性值的次高位数据的序列化结果写入固定区域的第二位,以此类推;
若属性值大于等于所述阈值,则按照从低位到高位的顺序依次序列化所述属性值的每一位数据,将每一位数据的序列化结果依次写入整体缓冲区的固定区域,其中,将属性值的最低位数据的序列化结果写入固定区域的最后一位,将属性值的次低位数据的序列化结果写入固定区域的倒数第二位,以此类推;在属性值的序列化结果全部写入固定区域后,将属性值的序列化结果移至固定区域的最前端。
9.如权利要求8所述的对象序列化装置,其中,所述容量预估模块适于按照以下步骤确定整体缓冲区的预估容量:
确定所述对象的所有属性名所占用的总字节数;
预估所述对象的所有属性值的序列化结果所占用的总字节数;
确定对象序列化结果中分隔符、标识符所占用的总字节数;
将上述总字节数之和作为整体缓冲区的预估容量。
10.如权利要求9所述的对象序列化装置,其中,所述容量预估模块适于按照以下步骤预估所述对象的各属性值的序列化结果所占用的字节数:
对于所占用的存储空间固定的数据类型,将该数据类型的数据的序列化结果所能占用的最大字节数作为具有该数据类型的属性值的序列化结果所占用的字节数;
对于所占用的存储空间不固定但是能够获取属性值长度的数据类型,获取该属性值的长度,根据所述长度来确定该属性值的序列化结果所占用的字节数。
11.如权利要求8所述的对象序列化装置,其中,所述序列化模块适于按照以下步骤根据该属性的数据类型对属性值进行序列化:通过动态编译获取该属性的数据类型,根据所获取的数据类型调用相应的序列化方法对该属性值进行序列化。
12.如权利要求8-11中任一项所述的对象序列化装置,其中,所述序列化模块适于采用指针来执行所述写入的步骤。
13.如权利要求8所述的对象序列化装置,其中,还包括回收模块,适于在完成对象序列化之后,对所述整体缓冲区进行回收以实现缓冲区重用。
14.如权利要求13所述的对象序列化装置,其中,所述缓冲区请求模块在向操作系统请求具有所述预估容量的整体缓冲区之前,还适于:
判断现有的缓冲区中是否存在容量大于等于所述预估容量的缓冲区;
若是,则将该容量大于等于所述预估容量的缓冲区作为本次对象序列化的整体缓冲区;
若否,则向操作系统请求具有所述预估容量的整体缓冲区。
15.一种计算设备,包括如权利要求8-14中任一项所述的对象序列化装置。
CN201611036368.9A 2016-11-22 2016-11-22 一种对象序列化方法、装置和计算设备 Active CN106775638B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201611036368.9A CN106775638B (zh) 2016-11-22 2016-11-22 一种对象序列化方法、装置和计算设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201611036368.9A CN106775638B (zh) 2016-11-22 2016-11-22 一种对象序列化方法、装置和计算设备

Publications (2)

Publication Number Publication Date
CN106775638A CN106775638A (zh) 2017-05-31
CN106775638B true CN106775638B (zh) 2020-04-21

Family

ID=58971123

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201611036368.9A Active CN106775638B (zh) 2016-11-22 2016-11-22 一种对象序列化方法、装置和计算设备

Country Status (1)

Country Link
CN (1) CN106775638B (zh)

Families Citing this family (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108932123B (zh) * 2018-06-21 2022-03-11 北京奇虎科技有限公司 参数处理方法和装置
CN108876628A (zh) * 2018-06-28 2018-11-23 深圳数字动能信息技术有限公司 金融量化分析数据传输方法
CN109213745B (zh) * 2018-08-27 2022-04-22 郑州云海信息技术有限公司 一种分布式文件存储方法、装置、处理器及存储介质
CN109343836B (zh) * 2018-08-31 2021-09-10 创新先进技术有限公司 数据序列化、数据反序列方法、装置及设备
CN109446225B (zh) * 2018-09-26 2023-04-14 平安科技(深圳)有限公司 数据缓存方法、装置、计算机设备及存储介质
CN110362451B (zh) * 2019-07-17 2023-09-26 北京小米移动软件有限公司 一种监控方法、装置及介质
CN111241346B (zh) * 2020-01-15 2023-11-10 上海依图网络科技有限公司 一种对象序列化方法、装置、机器可读介质以及系统
CN111931200B (zh) * 2020-07-13 2024-02-23 车智互联(北京)科技有限公司 一种数据序列化方法、移动终端和可读存储介质
CN111783401B (zh) * 2020-07-23 2024-03-15 网易(杭州)网络有限公司 字符串处理方法及装置、计算机存储介质、电子设备
CN113704308B (zh) * 2021-09-02 2024-03-12 中国联合网络通信集团有限公司 数据缓存方法、装置、服务器及充值系统
CN116301666B (zh) * 2023-05-17 2023-10-10 杭州数云信息技术有限公司 Java对象序列化方法及其反序列化方法及装置、终端

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103593194A (zh) * 2013-11-21 2014-02-19 北京国双科技有限公司 对象序列化方法和装置
CN104281612A (zh) * 2013-07-03 2015-01-14 人人游戏网络科技发展(上海)有限公司 用于数据处理的方法和设备
CN105787128A (zh) * 2016-03-29 2016-07-20 四川秘无痕信息安全技术有限责任公司 一种恢复Java序列化文件数据的方法

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104281612A (zh) * 2013-07-03 2015-01-14 人人游戏网络科技发展(上海)有限公司 用于数据处理的方法和设备
CN103593194A (zh) * 2013-11-21 2014-02-19 北京国双科技有限公司 对象序列化方法和装置
CN105787128A (zh) * 2016-03-29 2016-07-20 四川秘无痕信息安全技术有限责任公司 一种恢复Java序列化文件数据的方法

Also Published As

Publication number Publication date
CN106775638A (zh) 2017-05-31

Similar Documents

Publication Publication Date Title
CN106775638B (zh) 一种对象序列化方法、装置和计算设备
US11003625B2 (en) Method and apparatus for operating on file
US20210382902A1 (en) Data storage method and data query method
KR20170093234A (ko) 다중 클러스터 이종 프로세서 아키텍처에서 동적 캐시 확장을 제공하기 위한 시스템 및 방법
CN114564509B (zh) 序列化方法、反序列化方法、设备、芯片以及介质
Li et al. Efficient depthwise separable convolution accelerator for classification and UAV object detection
JP4537771B2 (ja) データベースのサイズを変更するための方法、コンピュータ可読媒体およびシステム
US10409498B2 (en) Method and apparatus for managing memory
CN107003940B (zh) 用于在非统一存储器架构中提供改进的延迟的系统和方法
CN111723113A (zh) 业务数据的分布式缓存方法、装置、终端设备及存储介质
CN113656330A (zh) 确定访问地址的方法和装置
CN116860665A (zh) 由处理器执行的地址翻译方法及相关产品
US10275230B2 (en) Cache aware self-referential structure peeling
CN107748649B (zh) 一种缓存数据的方法和装置
US8838915B2 (en) Cache collaboration in tiled processor systems
CN113961086B (zh) 一种快捷键实现方法、计算设备及存储介质
KR102174337B1 (ko) 메모리 시스템 및 이를 포함하는 전자 장치
CN113724127B (zh) 一种图像矩阵卷积的实现方法、计算设备及储存介质
CN114691549A (zh) 一种文件写入方法、装置及计算设备
US20220237126A1 (en) Page table manager
WO2021249030A1 (zh) 随机数序列生成方法和随机数引擎
CN110960858B (zh) 一种游戏资源的处理方法、装置、设备及存储介质
KR20220064967A (ko) 프로세서 기반 디바이스에서 가변 즉시값 크기를 갖는 즉시 이동 명령어의 조기 실행의 인에이블링
CN114371798A (zh) 一种图片显示方法及计算设备
US9448982B2 (en) Immediate independent rasterization

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