深入浅出序列化之序列化框架(二)

在序列化技术中,除了java提供的序列化,还有很多其他的序列化技术。对于java而已,java序列化是由java语言自带的,使用比较方便简单。但是相对于优势,缺点也是很明显的,首先就是不支持跨语言扩展、性能相对不是很好、序列化以后产生的数据相对会比较大。

然后除了java自带的序列化,还有以下的一些序列化技术。

1.xml序列化框架

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

代码实现如下:
导入依赖

  <!--xml序列化-->
        <dependency>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
            <version>1.4.10</version>
        </dependency>

实现序列化和反序列化的类

public class ZmlSerializer implements ISerializer {

    XStream xStream=new XStream(new DomDriver());

    @Override
    public <T> byte[] serializer(T obj) {
        return xStream.toXML(obj).getBytes();
    }

    @Override
    public <T> T deSerializer(byte[] data, Class<T> clazz) {
        return (T) xStream.fromXML(new String(data));
    }
}

测试类:

public static void main(String[] args) {

        User user = new User("s",12);
        ISerializer xmlSerializer = (ISerializer) new ZmlSerializer();

        byte[] serializer = xmlSerializer.serializer(user);
        System.out.println(new String(serializer));
        User user1 = xmlSerializer.deSerializer(serializer, User.class);
        System.out.println(user1);
    }
image.png

2.JSON序列化框架

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,相对于XML 来说,JSON 的字节流更小,而且可读性也非常好。现在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 非常容易使用。

3.Hessian 序列化框架

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

这是一种支持动态类型、跨语言、基于对象传输的网络协议。JAVA对象序列化的二进制流是可以被其他语言反序列化的。hessian协议具有如下特性:

1.自描述序列化类型,不依赖外部描述符或接口定义,用一个字节表示常用的基础类型,极大缩短二进制流。
2.跟语言无关,支持脚本语言
3.协议比较简单,比java原生的要高效很多。在hessian2.0进行升级后,新增了一个压缩编码,而序列化的二进制流是java序列化的50%,耗时是java序列化的30,而反序列化是其20%。

hessian序列化会把复杂对象所有熟悉存在一个map中,进行序列化。所以在父类、子类存在同名变量的情况下,hessian序列化时,先序列化子类,再序列化父类,因此序列化的结果会导致子类同名变量被父类的覆盖。

4.Protobuf 序列化框架(重点,一般接触比较少)

1.独立语言,独立平台。不同语言有不同的序列化方式。
2.Protobuf是一个基于表示层的协议,可以跟各种协议一起使用。
3.空间开销,性能,解析性能都要好。

缺点:
实现比较麻烦,有独立的编译器,要考虑学习的成本。

https://github.com/google/protobuf/releases 找到 protoc-3.5.1-win32.zip

看看怎么实现以及语法:

syntax="proto2";
package com.zxy.serial;
option java_package = "com.zxy.serial";
option java_outer_classname="UserProtos";
message User {
required string name=1;
required int32 age=2;
}

proto 的语法

  1. 包名
  2. option 选项
  3. 消息模型(消息对象、字段(字段修饰符-required/optional/repeated)
    字段类型(基本数据类型、枚举、消息对象)、字段名、标识号)

生成实体类
在protoc.exe 安装目录下执行如下命令

.\protoc.exe --java_out=./ ./user.proto

运行查看结果
将生成以后的UserProto.java 拷贝到项目中


y

Protobuf 原理分析

核心原理: protobuf 使用varint(zigzag)作为编码方式, 使用T-LV
作为存储方式.

技术层面

  1. 序列化空间开销,也就是序列化产生的结果大小,这个影响到传输的性能
  2. 序列化过程中消耗的时长,序列化消耗时间过长影响到业务的响应时间
  3. 序列化协议是否支持跨平台,跨语言。因为现在的架构更加灵活,如果存在异构系统通信需求,那么这个是必须要考虑的
  4. 可扩展性/兼容性,在实际业务开发中,系统往往需要随着需求的快速迭代来实现快速更新,这就要求我们采用的序列化协议基于良好.的可扩展性/兼容性,比如在现有的序列化数据结构中新增一个业务字段,不会影响到现有的服务
  5. 技术的流行程度,越流行的技术意味着使用的公司多,那么很多坑都已经淌过并且得到了解决,技术解决方案也相对成熟
  6. 学习难度和易用性.

选型建议

  1. 对性能要求不高的场景,可以采用基于XML 的SOAP 协议
  2. 对性能和间接性有比较高要求的场景,那么Hessian、Protobuf、Thrift、
    Avro 都可以。
  3. 基于前后端分离,或者独立的对外的api 服务,选用JSON 是比较好的,对于调试、可读性都很不错
  4. Avro 设计理念偏于动态类型语言,那么这类的场景使用Avro 是可以的.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容