发明内容
为了能够提供一种脱离具体编程语言的限制的序列化和反序列化的方法,以减少对BitSet进行维护的成本,本发明提供了一种序列化和反序列化的方法、装置及系统。所述技术方案如下:
一种序列化的方法,所述方法包括:
从BitSet中获取其自身的长度,并将所述长度存储在数据流中;
从所述BitSet中获取每位状态位,将每次获取的八位状态位组成字节并存储在所述数据流中。
一种对利用所述序列化的方法得到的数据流进行反序列化的方法,所述方法包括:
建立一个BitSet,从数据流中获取BitSet的长度,将所述长度存储在所述建立的BitSet中;
将所述数据流中的每个存储状态位的字节分别与八个状态码进行位与操作,恢复出所述每个存储状态位的字节包括的八位状态位;
将所述每个字节的八位状态位存储在所述建立的BitSet中。
一种序列化的装置,所述装置包括:
获取模块,用于从BitSet中获取其自身的长度,并将所述长度存储在数据流中;
组成模块,用于从所述BitSet中获取每位状态位,将每次获取的八位状态位组成字节并存储在所述数据流中。
一种对利用所述序列化的装置得到的数据流进行反序列化的装置,所述装置包括:
建立模块,用于建立一个BitSet,从数据流中获取BitSet的长度,将所述长度存储在所述建立的BitSet中;
恢复模块,用于将所述数据流中的每个存储状态位的字节分别与八个状态码进行位与操作,恢复出所述每个存储状态位的字节包括的八位状态位;
存储模块,用于将所述每个字节的八位状态位存储在所述建立的BitSet中。
一种序列化和反序列化的系统,所述系统包括序列化的装置和反序列化的装置;
所述序列化的装置,用于从BitSet中获取其自身的长度,并将所述长度存储在数据流中;从所述BitSet中获取每位状态位,将每次获取的八位状态位组成字节并存储在所述数据流中;
所述反序列化的装置,用于建立一个BitSet,从所述数据流获取BitSet的长度,将所述长度存储在所述建立的BitSet中;将所述数据流中的每个存储状态位的字节分别与八个状态码进行位与操作,恢复出所述每个存储状态位的字节包括的八位状态位;将所述每个字节的八位状态位存储在所述建立的BitSet中。
在进行序列化操作时,通过从BitSet中获取每位状态位,并将每次获取的八位状态位组成一个字节并存储在数据流中;在进行反序列化操作时,通过将数据流中存储状态位的每个字节分别与八个状态码进行位与操作,恢复出每个字节包括的八位状态位,并将每个字节包括的八位状态位存储在BitSet中。由于字节是用于计量存储容量和传输容量的一种基本的计量单位,每一种编程语言都能识别字节,因而每种编程语言都能支持该序列化和反序列化的操作,从而脱离了具体编程语言的限制,减少了对BitSet进行维护的成本。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
实施例1
如图1所示,本发明实施例提供了一种序列化的方法,包括:
步骤101:从BitSet中获取其自身的长度,并将该长度存储在数据流中;
步骤102:从BitSet中获取每位状态位,将每次获取的八位状态位组成字节并存储在数据流中。
在本发明实施例中,从BitSet中获取每位状态位,并将每次获取的八位状态位组成一个字节并存储在数据流中。由于字节是用于计量存储容量和传输容量的一种基本的计量单位,每一种编程语言都能识别字节,因而每种编程语言都能支持本实施例提供的序列化的方法,从而脱离了具体编程语言的限制,减少了对BitSet进行维护的成本。
实施例2
如图2所示,本发明实施例提供了一种序列化的方法,包括:
步骤201:从BitSet中获取其自身的长度,并将其存储在数据流中,其中,BitSet的长度为其自身中包括的状态位的总数目;
其中,数据流为事先划分的存储区域,数据流可以为文件流等形式,用于存储对BitSet进行序列化后得到的结果。
其中,对象中包括一个或多个条件,每个条件的状态位用二进制数据0或1表示。BitSet是一种数据结构,BitSet用于存储BitSet的长度和按对象中的条件的顺序存储每个条件的状态位。另外,在数据流中事先划分一个或多个字节的空间用于存储BitSet的长度,通常在数据流中划分前四个字节的空间用于存储BitSet的长度。
假设,对象中包括A、B、C、D、E、F、G、H和J九个条件,且九个条件的状态位分别为1、0、0、1、1、1、0、0、1,则在BitSet中存储BitSet的长度9和依次存储九个条件的状态位分别为1、0、0、1、1、1、0、0、1。
其中,在本步骤中,可以直接从BitSet读取BitSet的长度。例如,直接从BitSet读取其自身的长度9,并将其保存到数据流的前4个字节中。
步骤202:设置第一指针指向BitSet中存储的第一位状态位;
步骤203:从BitSet中读取第一指针指向的状态位,缓存读取的状态位,设置第一指针指向下一位状态位;
例如,在步骤202中,设置第一指针指向BitSet的第一位状态位1,在本步骤中读取第一指针指向的状态位1,并将其缓存,再设置第一指针指向下一位状态位即指向状态位0。
步骤204:判断读取的当前状态位是否为最后一位状态位,如果否,则执行步骤205,如果是,则执行步骤207;
步骤205:判断缓存的状态位是否达到八位,如果否,则执行步骤203,如果是,则执行步骤206;
例如,重复地执行步骤203-205,依次从BitSet中读取八位状态位分别为1、0、0、1、1、1、0和0,并分别缓存每次读取的状态位,如此得到缓存的八位状态位分别为1、0、0、1、1、1、0和0,然后执行步骤206。
步骤206:将缓存的八位状态位组成一个字节,并保存在数据流中,清空缓存的状态位,返回执行步骤203;
其中,一个字节由八位二进制数据组成,由于BitSet中的每一位状态位都为一位二进制数据,因此,可以将缓存的八位状态位组成一个字节,使得该字节保存八位状态位。在组成字节时,按缓存八位状态位的先后顺序分别将八位状态位作为字节中从右到左的八个二进制数据,如此,将最先缓存的一位状态位作为字节中的最右边的一位二进制数据,最后缓存的一位状态位作为字节中的最左边的一位二进制数据。另外,在数据流中也是按组成每个字节的先后顺序存储每个字节。
例如,在本实施例中,先后缓存的八位状态位分别1、0、0、1、1、1、0和0,将该八位状态位组成一个字节为00111001,并将该字节保存在数据流中,将缓存的该八位状态位清空,返回执行步骤203,其中,由于已从BitSet中读取第八位状态位,则此时已设置第一指针指向BitSet中的第九位状态位即指向状态位1。
其中,由于字节是用于计量存储容量和传输容量的一种基本的计量单位,每一种编程语言都能识别字节,因而使得每种编程语言都能支持本实施例提供的序列化的方法。
步骤207:判断缓存的状态位是否达到八位,如果是,则执行步骤208,如果否,则执行步骤209;
步骤208:将缓存的八位状态位组成一个字节,并保存在数据流中,清空缓存的状态位,操作结束;
步骤209:对缓存的状态位进行补零,使得缓存的状态位达到八位,再将其组成一个字节,并保存在数据流中,操作结束。
例如,在步骤203中读取第一指针指向第九位状态位1,在步骤204中判断出第一指针指向的第九位状态位1为最后一位,并在步骤208中判断出缓存的状态位未达到八位,则在本步骤中对缓存的状态位进行补零,使缓存的状态位达到八位分别为1、0、0、0、0、0、0和0,将其组成一个字节00000001,并将该字节保存在数据流中。如此,得到对该BitSet进行序列化后得到的数据流包括两个用于存储状态位的字节分别为00111001和00000001。
在本发明实施例中,从BitSet中获取每位状态位,并将每次获取的八位状态位组成一个字节并存储在数据流中。由于字节是用于计量存储容量和传输容量的一种基本的计量单位,每一种编程语言都能识别字节,因而每种编程语言都能支持本实施例提供的序列化的方法,脱离了具体语言的限制,减少了对BitSet进行维护的成本。
实施例3
如图3所示,本发明实施例提供了一种对实施例1得到的数据流进行反序列化的方法,包括:
步骤301:建立一个BitSet,从数据流中获取BitSet的长度,将该长度存储在建立的BitSet中;
步骤302:将数据流中存储状态位的每个字节分别与八个状态码进行位与操作,恢复出每个字节包括的八位状态位;
步骤303:将每个字节的八位状态位存储在建立的BitSet中。
在本发明实施例中,将数据流中存储状态位的每个字节分别与八个状态码进行位与操作,恢复出每个字节包括八位状态位,并将每个字节包括的八位状态位存储在BitSet中。由于字节是用于计量存储容量和传输容量的一种基本的计量单位,每一种编程语言都能识别字节,因而每种编程语言都能支持本实施例提供的反序列化的方法。
实施例4
如图4所示,本发明实施例提供了一种对实施例2得到的数据流进行反序列化的方法,包括:
步骤401:建立一个空白的BitSet,从数据流中获取BitSet的长度,并将获取的BitSet的长度存储在建立的BitSet中;
例如,建立一个空白的BitSet,从数据流中获取BitSet的长度9,将获取的长度9存储在建立的空白的BitSet中。其中,由于通常将BitSet的长度存储在数据流中的前四个字节的空间内,因此,可以直接从数据流的前四个字节中读取BitSet的长度。
步骤402:在数据流中设置第二指针指向第一个存储状态位的字节;
例如,在数据流中设置第二指针指向第一个存储状态位的字节00111001。
步骤403:从数据流中读取第二指针指向的字节,将读取的字节分别与八个状态码进行位与操作,恢复出该字节包括的八位状态位;
其中,八个状态码分别为00000001、0000010、00000100、00001000、00010000、00100000、01000000和10000000。
例如,从数据流中读取第二指针指向的第一个存储状态位的字节00111001,并将该字节分别与00000001、0000010、00000100、00001000、00010000、00100000、01000000和10000000做位与操作,得到该字节包括的八位状态位分别为1、0、0、1、1、1、0和0。
步骤404:判断第二指针指向的字节是否为数据流中的最后一个字节,如果否,执行步骤405,如果是,执行步骤406;
步骤405:将恢复的八位状态位存储在建立的BitSet中,在数据流中设置第二指针指向下一个字节,返回执行步骤403;
例如,在步骤404中判断出第二指针未指向数据流中的最后一个字节,在本步骤中将在步骤403中恢复出的八位状态位1、0、0、1、1、1、0和0存储在建立的BitSet中,同时设置第二指针指向数据流中的下一个字节,即指向字节00000001,并从步骤403重新开始执行。另外,在步骤403中读取字节00000001,恢复出字节00000001中包括的八位状态位分别为1、0、0、0、0、0、0和0,且在步骤404中判断出第二指针指向最后一个字节,开始执行步骤406。
步骤406:将获取的BitSet的长度与数字8做除法运算得到余数,判断余数的值是否为0,如果是,执行步骤407,如果否,执行步骤408;
其中,如果余数为0,则在对BitSet进行序列化时没有进行补零操作,如果余数不为0,则在对BitSet进行序列化时进行补零操作,且在序列化时得到的最后一个字节的前余数位二进制数据由BitSet中的状态位组成。
例如,从数据流中获取BitSet的长度9,并将9与8做除法运算得到余数1,则在序列化时得到的最后一个字节为00000001,该字节的前一位二进制数据1为BitSet中存储的状态位。
步骤407:将从最后一个字节中恢复出的八位状态位存储在建立的BitSet中,操作结束;
步骤408:在从最后一个字节中恢复出的八位状态位中,选取前余数位的状态位,并将选取的状态位存储在建立的BitSet中,操作结束。
例如,由于计算出的余数为1,则在本步骤中判断出余数不为零,从恢复的八位状态位即1、0、0、0、0、0和0中,取前1位状态位1,并将状态位1存储在建立的BitSet中。
在本发明实施例中,将数据流中存储状态位的每个字节分别与八个状态码进行位与操作,恢复出每个字节包括八位状态位,并将每个字节包括的八位状态位存储在BitSet中。由于字节是用于计量存储容量和传输容量的一种基本的计量单位,每一种编程语言都能识别字节,因而每种编程语言都能支持本实施例提供的反序列化的方法,从而脱离了具体编程语言的限制。
实施例5
如图5所示,本发明实施例提供了一种序列化的装置,包括:
获取模块501,用于从BitSet中获取其自身的长度,并将该长度存储在数据流中;
组成模块502,用于从BitSet中获取每位状态位,将每次获取的八位状态位组成字节并存储在数据流中。
其中,组成模块502具体包括:
第一设置单元,用于设置第一指针指向BitSet存储的第一位状态位;
第一读取单元,用于读取第一指针指向的状态位,缓存读取的状态位,并设置第一指针指向下一位状态位;
组成单元,用于当缓存的状态位达到八位时,将缓存的状态位组成一个字节,并清空缓存的状态位;
进一步地,该装置还包括:
补零模块,用于当获取到最后一位状态位且未组成字节的状态位不足八位时,对未组成字节的状态位补零得到八位状态位,将得到的八位状态位组成字节并存储在数据流中。
在本发明实施例中,从BitSet中获取每位状态位,并将每次获取的八位状态位组成一个字节并存储在数据流中。由于字节是用于计量存储容量和传输容量的一种基本的计量单位,每一种编程语言都能识别字节,因而每种编程语言都能支持本实施例提供的序列化操作,从而脱离了具体编程语言的限制,减少了对BitSet进行维护的成本。
实施例6
如图6所示,本发明实施例提供了一种对实施例5得到的数据流进行反序列化的装置,包括:
建立模块601,用于建立一个BitSet,从数据流中获取BitSet的长度,将该长度存储在建立的BitSet中;
恢复模块602,用于将数据流中的每个存储状态位的字节分别与八个状态码进行位与操作,恢复出每个存储状态位的字节包括的八位状态位;
存储模块603,用于将每个字节的八位状态位存储在建立的BitSet中。
其中,恢复模块602具体包括:
第二设置单元,用于设置第二指针指向数据流中的第一个存储状态位的字节;
第二读取单元,用于读取第二指针指向的字节,设置第二指针指向下一个字节;
位与操作单元,用于将读取的字节分别与八个状态码进行位与操作,恢复出读取的字节包括的八位状态位;
进一步地,该装置还包括:
选取模块,用于将该长度与数字八进行除法运算得到余数,当余数不为零时,在数据流中的最后一个字节存储的八位状态位中,选取前余数位的状态位,将选取的状态位存储在建立的BitSet中。
其中,八个状态码分别为00000001、0000010、00000100、00001000、00010000、00100000、01000000和10000000。
在本发明实施例中,将数据流中存储状态位的每个字节分别与八个状态码进行位与操作,恢复出每个字节包括八位状态位,并将每个字节包括的八位状态位存储在BitSet中。由于字节是用于计量存储容量和传输容量的一种基本的计量单位,每一种编程语言都能识别字节,因而每种编程语言都能支持本实施例提供的反序列化操作,从而脱离了具体编程语言的限制。
实施例7
如图7所示,本发明实施例提供了一种序列化和反序列化的系统,该系统包括序列化的装置701和反序列化的装置702;
序列化的装置701,用于从BitSet中获取其自身的长度,并将该长度存储在数据流中;从BitSet中获取每位状态位,将每次获取的八位状态位组成字节并存储在数据流中;
反序列化的装置702,用于建立一个BitSet,从数据流中获取BitSet的长度,将长度存储在建立的BitSet中;将数据流中的每个存储状态位的字节分别与八个状态码进行位与操作,恢复出每个存储状态位的字节包括的八位状态位;将每个字节的八位状态位存储在建立的BitSet中。
在本发明实施例中,当对BitSet进行序列化时,从BitSet中获取每位状态位,并将每次获取的八位状态位组成一个字节并存储在数据流中;当进行反序列化时,将数据流中存储状态位的每个字节分别与八个状态码进行位与操作,恢复出每个字节包括八位状态位,并将每个字节包括的八位状态位存储在BitSet中。由于字节是用于计量存储容量和传输容量的一种基本的计量单位,每一种编程语言都能识别字节,因而每种编程语言都能支持本实施例提供的序列化和反序列化的操作,从而脱离了具体编程语言的限制。
以上实施例提供的技术方案中的全部或部分内容可以通过软件编程实现,其软件程序存储在可读取的存储介质中,存储介质例如:计算机中的硬盘、光盘或软盘。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。