您的位置 首页 java

java使用protoStuff实现序列化和反序列化

之前曾经写了两篇 java 的序列的机制,一种是默认的java 序列化 机制,这种方式效率太低。另外一种是谷歌的protobuf,但是这种我们还要写proto文件,并且我们还要使用工具来编译生成java文件,实在太麻烦。但是protostuff却不一样,能够很好的解决上面两者的问题。这篇文章就研究一下如何去使用,并对其进行一个简单的分析。

一、认识protostuff

其实protostuff也是有局限性的,比如说在序列化的文件在10M以下的时候,还是使用java自带的序列化机制比较好,但是文件比较大的时候还是protostuff好一点,这里的10M不是严格的界限。

protostuff也是谷歌的产品,它是基于protobuf发展而来的,相对于protobuf提供了更多的功能和更简易的用法。

废话不多说,直接看一下protoStuff是如何使用的吧。

二、代码实现环境准备:添加依赖或者是jar

这里我使用了 maven ,直接添加依赖即可,如果你没有使用maven,在百度上搜索相应的jar包就好了。

1、定义要序列化的 bean

首先是学生类

然后是学校类

在这里我们真正要序列化的是School,但是为了使得例子更有说服力,于是就在School里面定义了Student。

2、protoStuff序列化工具类

这其实就是一个工具类,这里面的代码可以不用更改,直接拿过来就可以使用了。不过在这里有必要对里面的一些字段方法等进行一个说明。

(1)字段LinkedBuffer

这个字段表示,申请一个内存空间用户 缓存 ,LinkedBuffer.DEFAULT_BUFFER_SIZE表示申请了默认大小的空间512个字节,我们也可以使用MIN_BUFFER_SIZE,表示256个字节。

(2)字段schemaCache

这个字段表示缓存的Schema。那这个Schema是什么呢?就是一个组织结构,就好比是数据库中的表、视图等等这样的组织机构,在这里表示的就是序列化对象的结构。

(3)方法serialize

它是序列化方法,里面的代码很容易理解,首先获得要序列化对象的类,然后为其分配一个缓存空间,其次获得这个类的Schema。最后一行代码ProtostuffIOUtil.toByteArray进行序列化。

(4)方法deserialize

表示反序列化,反序列里面的代码更简单了,首先根据序列化对象获取其组织结构Schema。然后根据byte直接mergeFrom成一个对象。

(5)方法getSchema

获取序列化对象的组织结构。

3、测试

运行一下就能出现结果,很简单。上面的ProtostuffUtils是一个工具类,你可以保留下来,复制粘贴到任何地方使用。下面的小结是对其底层原理的解析,如果你只是简单的使用,到此就OK了。如果想深入了解可以接着往下看

三、protoStuff底层是如何实现序列化的?

上面只是给出了一个基本的使用,并且对Protostuff序列化工具类中的字段和方法进行了一个简单的介绍,在这里我们深入的去分析一下到底底层是如何实现序列化和反序列化的,

在上面序列化方法中,最核心的其实就是最后一句:data = ProtostuffIOUtil.toByteArray(obj, schema, buffer);如何实现序列化其实就在于这个toByteArray方法,我们深入这个方法中看看:

我们可以看到schema.writeTo(output, message);是真正的核心,我们继续追进去看看:

原来里面还有一层,没关系真正实现序列化的源头马上就要浮出水面了

看到了吧其实就是把序列化对象信息保存成CharSequence,然后序列化。

对于反序列化呢?核心ProtostuffIOUtil.mergeFrom(data, obj, schema);我们也追进去看看

想要弄清楚,就想继续追进去看:

继续进去看看

OK,真正马上出来了,有点耐心继续跟进去:

到了这一步了,应该就明白了吧。

文章来源:智云一二三科技

文章标题:java使用protoStuff实现序列化和反序列化

文章地址:https://www.zhihuclub.com/175587.shtml

关于作者: 智云科技

热门文章

网站地图