常见的序列化技术及框架(Protobuf的使用)

常见的序列化技术

使用JAVA进行序列化有它的优点,也有它的缺点。
优点:JAVA语言本身提供,使用比较方便和简单。
缺点:不支持跨语言处理,性能相对不是很好,序列化以后产生的数据相对较大。

XML序列化框架
XML序列化的好处在于可读性好,方便阅读和调试。但是序列化以后的字节码文件比较大,而且效率不高,适用于对性能不高,而且QPS较低的企业级内部系统之间的数据交换的场景,同时XML又具有语言无关性,所以还可以用于异构系统之间的数据交换和协议。比如我们熟知的Webservice,就是采用XML格式对数据进行序列化的。

JSON序列化框架
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,相对于XML来说,JSON 的字节流更小,而且可读性也非常好。现在JSON数据格式在企业运用是最普遍的,JSON序列化常用的开源工具有很多。
1. Jackson (https://github.com/FasterXML/jackson
2. 阿里开源的 FastJson (https://github.com/alibaba/fastjon
3. Google的GSON (https://github.com/google/gson)
这几种json序列化工具中,Jackson与fastjson要比GSON的性能要好,但是Jackson、GSON的稳定性要比Fastjson好,而fastjson的优势在于提供的api非常容易使用。

Hessian序列化框架
Hessian是一个支持跨语言传输的二进制序列化协议,相对于Java默认的序列化机制来说,Hessian具有更好的性能和易用性,而且支持多种不同的语言。实际上Dubbo采用的就是Hessian序列化来实现,只不过Dubbo对Hessian进行了重构,性能更高。

Protobuf 序列化框架

Protobuf是Google的一种数据交换格式,它独立于语言、独立于平台。
Google提供了多种语言来实现,比如Java、C、Go、Python,每一种实现都包含了相应语言的编译器和库文件。Protobuf使用比较广泛,主要是空间开销小和性能比较好,非常适合用于公司内部对性能要求高的RPC调用。 另外由于解析性能比较高,序列化以后数据量相对较少,所以也可以应用在对象的持久化场景中。但是要使用Protobuf会相对来说麻烦些,因为他有自己的语法,有自己的编译器。

1》安装protobuf
https://github.com/google/protobuf/releases找到protobuf-java-3.5.1.zip,解压得到protobuf-3.5.1的文件夹。
再继续从https://github.com/google/protobuf/releases找到protoc-3.5.1-win32.zip,然后解压,将bin目录下的protoc.exe放入protobuf-3.5.1\src目录下。
这里写图片描述
2》配置环境变量
编辑系统变量Path,添加protoc.exe的存放目录。
这里写图片描述
3》编辑proto文件
新建user.proto的文件(D:\tools\proto)。内容如下:

syntax="proto2";
package com.ft.serial;


option java_package="com.ft.serial";
option java_outer_classname="UserProtos";   //生成的数据访问类的类名


message User{
    required string name=1;
    required int32 age=27;  //必须字段,在后面的使用中必须为该段设置值
    optional string email=3 //可选字段,在后面的使用中可以自由决定是否为该字段设置值
}

4》执行命令
命令格式:

protoc.exe -I=proto的输入目录 –java_out=java类输出目录 proto的输入目录包括proto文件

打开cmd执行如下命令:

C:\Users\FUTAO>protoc.exe -I=D:\tools\proto –java_out=D:\tools\proto D:\tools\p
roto\user.proto

最终在D:\tools\proto目录下得到UserProtos.java
注意1:在执行命令的过程中,可能会出现这样的错误。

File does not reside within any path specified using –proto_path (or -I).
You must specify a –proto_path which encompasses this file.
Note that the proto_path must be an exact prefix of the .proto
file names – protoc is too dumb to figure out when two paths (e.g. absolute and relative)
are equivalent (it’s harder than you think).

这是因为命令格式,protoc.exe -I=D:\tools\proto –java_out=D:\tools\proto D:\tools\proto\user.proto,一定要保证路径1和路径3相同。
这里写图片描述
注意2:在生成的UserProtos.java类导入项目后,可能会报错。这是由于版本不对应导致的,比如我现在安装的protobuf是protobuf-3.5.1,那么生成的UserProtos.java是适应3.5.1这个版本的。所以pom.xml文件里配置的protobuf-java版本就不能低于3.5.1,我的pom.xml文件配置protobuf-java如下:
这里写图片描述
5》测试UserProtos.java
将生成的UserProtos.java拷贝到项目中

public class Test {

    public static void main(String[] args) throws InvalidProtocolBufferException {
        UserProtos.User user= UserProtos.User.newBuilder().setName("taofut").setAge(27).build();
        ByteString bytes=user.toByteString();

        UserProtos.User nUser=UserProtos.User.parseFrom(bytes);
        System.out.println(nUser);
    }
}
//执行结果:
//name: "taofut"
//age: 27

猜你喜欢

转载自blog.csdn.net/fu123123fu/article/details/80610422
今日推荐