美文网首页
Java序列化框架

Java序列化框架

作者: FX_SKY | 来源:发表于2017-04-22 12:33 被阅读1153次

Java默认的序列化机制效率很低、序列化后的码流也较大,所以涌现出了非常多的优秀的Java序列化框架,例如:hessianprotobufthriftprotostuffkryomsgpackavrofst 等等。

本文主要介绍hessian、kryo、protostuff的使用,其它的可以去查看官方documentation。

使用

hessian

maven依赖:

        <dependency>
            <groupId>com.caucho</groupId>
            <artifactId>hessian</artifactId>
            <version>4.0.38</version>
        </dependency>

序列化,代码如下:

    public void serialize(){

        Car car = new Car();
        car.setName("X5");
        car.setBrand("BMW");
        car.setPrice(64.5);
        car.setSpeed(200);

        System.out.println("序列化:"+car);

        //Serialization
        Hessian2Output out = null;
        try {
            File objectFile = new File("car.bin");
            out = new Hessian2Output(new FileOutputStream(objectFile));
            out.startMessage();
            out.writeObject(car);
            out.completeMessage();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

反序列化

    public void deserialize(){
        
        InputStream bin = null;
        Hessian2Input in = null;
        try {
            File objectFile = new File("car.bin");
            bin = new FileInputStream(objectFile);
            in = new Hessian2Input(bin);

            in.startMessage();
            Car car = (Car) in.readObject();
            in.completeMessage();
            
            System.out.println("反序列化:"+car);
            
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                bin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

kryo

maven依赖:

        <dependency>
            <groupId>com.esotericsoftware</groupId>
            <artifactId>kryo</artifactId>
            <version>4.0.0</version>
        </dependency>

kryo 序列化如下:

        Author author = new Author("Ricky", 28);

        System.out.println(author);

        Kryo kryo = new Kryo();
        // Write Obj to File
        Output output = null;
        try {
            File file = new File("author.bin");
            output = new Output(new FileOutputStream(file));
            kryo.writeObject(output, author);
            output.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (KryoException e) {
            e.printStackTrace();
        }finally{
            IoUtils.closeQuietly(output);
        }

反序列化如下:

        // Read Obj from File
        Input input = null;
        try {
            File file = new File("author.bin");
            input = new Input(new FileInputStream(file));
            Author newAuthor = kryo.readObject(input, Author.class);
            System.out.println(newAuthor);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (KryoException e) {
            e.printStackTrace();
        }finally{
            IoUtils.closeQuietly(input);
        }

protostuff

maven依赖:

        <dependency>
            <groupId>io.protostuff</groupId>
            <artifactId>protostuff-core</artifactId>
            <version>1.5.3</version>
        </dependency>
        <dependency>
            <groupId>io.protostuff</groupId>
            <artifactId>protostuff-runtime</artifactId>
            <version>1.5.3</version>
        </dependency>

protostuff 序列化如下:

        Person person = new Person("ricky", "feng", "ricky_feng@163.com");
        person.setFriends(Arrays.asList("Paul", "Kobe", "James"));
        person.setAddress(new Address("湖北省", "武汉市", "武昌区", "珞喻路"));
        Map<String, String> tag = new HashMap<>();
        tag.put("aa", "abc");
        person.setTag(tag);

        Schema<Person> schema = RuntimeSchema.getSchema(Person.class);

        LinkedBuffer buffer = LinkedBuffer.allocate();
        byte[] protostuff = null;
        // 序列化
        try {
            protostuff = ProtostuffIOUtil.toByteArray(person, schema, buffer);
            System.out.println("bytes len:"+protostuff.length);
        } finally {
            buffer.clear();
        }

反序列化如下:

        byte[] protostuff = ...;
        Schema<Person> schema = RuntimeSchema.getSchema(Person.class);
        // 反序列化
        Person p = schema.newMessage();
        ProtostuffIOUtil.mergeFrom(protostuff, p, schema);
        System.out.println(p);

完整示例源码下载:https://github.com/TiFG/daily-codelab/tree/master/serialization-sample

Java序列化框架性能比较

序列化框架Serializers(无共享引用)

  • 无循环引用。 一个对象如果被引用两次则会序列化两次
  • 没有手工优化
  • schema预先已知

Ser Time+Deser Time (ns)

time.png

Size, Compressed size in bytes

size.png

全对象图序列化(Full Object Graph Serializers)

  • 支持全部的object graph读写. Object graph可能包含循环引用.
  • 无预先处理, 没有预先的类生成,注册. 所有都运行时产生, 比如使用反射.
  • 注意通常不会跨编程语言。 然而JSON/XML格式由于其特殊性可以跨语言.

Ser Time+Deser Time (ns)

full_time.png

Size, Compressed size in bytes

full_size.png

参考

jvm-serializers:https://github.com/eishay/jvm-serializers


jvm-serializers bench-mark:https://github.com/eishay/jvm-serializers/wiki

相关文章

  • 第3讲 编解码

    本章要点: java序列化缺点 业界流行的集中编解码框架介绍 3.1 java序列化缺点 无法跨越语言,是java...

  • RDD算子之后

    RDD序列化 闭包检查 Kryo序列化框架 Java的序列化能够序列化任何的类。单比较重(字节多),序列化后,对象...

  • Java序列化框架

    Java默认的序列化机制效率很低、序列化后的码流也较大,所以涌现出了非常多的优秀的Java序列化框架,例如:hes...

  • 4.Netty入门第四章——编解码技术

    简介 本章主要内容: Java序列化的缺点 业界流行的几种编解码框架介绍 Java的序列化目的: 网络传输 对象持...

  • 自定义Jackson序列化器进行数据脱敏

    前言 Jackson 是用来序列化和反序列化 json 的 Java 的开源框架。Spring MVC 的默认 j...

  • 高性能Java序列化框架Fse发布

    高性能Java序列化框架Fse发布 [TOC] 使用场景 将Java对象序列化为二进制数据进行保存,以及二进制数据...

  • Effective Java(3rd)-Chapter12 序列

      本章关注对象序列化,它是Java的框架,用于将对象编码为字节流(序列化),并从对象的编码中重构对象(反序列化)...

  • Jackson的基本用法

    Jackson 是当前用的比较广泛的,用来序列化和反序列化 json 的 Java 的开源框架。Jackson 社...

  • Java-序列化-反序列化

    Thanks Java基础学习总结——Java对象的序列化和反序列化java序列化反序列化原理Java 序列化的高...

  • JSONPath入门之Snack3篇

    Snack3 for java 一个微型JSON框架 基于jdk8,60kb。有序列化反序列化、解析和转换、支持 ...

网友评论

      本文标题:Java序列化框架

      本文链接:https://www.haomeiwen.com/subject/vgkszttx.html