zoukankan      html  css  js  c++  java
  • Java序列化技术性能分析(JDK原生与Protostuff)

    熟悉Java的朋友应该知道Java有一个叫序列化的技术,即把一个Object转换为可保存,可传输的流数据。相应的,同时存在反序列化,即将流数据转换为Object类,而在转换的过程中,该Object保持者其自身的状态。不会应该序列化或者反序列化而丢失。通常在缓存中,RPC(远程调用),或者长久保存会话信息时,大有用处。

    关于序列化的时候,大部分情况下想到的是对于需要序列化的对象实现Serializable标志接口,同时为该对象提供一个唯一的serialVersionUID。

    示例代码

    public class Person implements Serializable {  
     private static final long serialVersionUID = -763618247875550322L;
        private String name;  
    
        public String getName() {  
            return name;  
        }  
        public void setName(String name) {  
            this.name = name;  
        }  
    }  
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    import java.io.FileInputStream;  
    import java.io.FileOutputStream;  
    import java.io.ObjectInputStream;  
    import java.io.ObjectOutputStream;  
    
    public class WhySerialversionUID {  
    
    public static void main(String[] args) throws Exception {  
    
    //这里是把对象序列化到文件         
    Person crab = new Person();  
    crab.setName("kaka");  
    
    ObjectOutputStream oo = new ObjectOutputStream (new FileOutputStream("kakaFile"));  
    oo.writeObject(crab);  
    oo.close();  
    
    //这里是把文件序列化到对象
    ObjectInputStream oi = new ObjectInputStream (new FileInputStream("kakaFile"));  
    Person kaka = (Person) oi.readObject();  
    //输出为Hi, My name is kaka
    System.out.println("Hi, My name is " + kaka.getName());  
    oi.close();  
        }  
    }  
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    看起来使用JDK提供的序列化技术没有什么问题,其实不然。JDK提供的序列化技术相对而已效率较低。在转换二进制数组过程中空间利用率较差。github上有个专门对比序列化技术做对比的数据:https://github.com/eishay/jvm-serializers/wiki

    其中看的出来性能最优的为google开发的colfer 。这个框架尽管性能优秀,但它太过于灵活,灵活到Schema都要开发者自己指定,所以对开发者不是很友好。我推荐使用Protostuff,其性能稍弱与colfer,但对开发者很友好,同时性能远远高于JDK提供的Serializable。

    添加依赖:

            <dependency>
                <groupId>io.protostuff</groupId>
                <artifactId>protostuff-core</artifactId>
                <version>1.4.4</version>
            </dependency>
            <dependency>
                <groupId>io.protostuff</groupId>
                <artifactId>protostuff-runtime</artifactId>
                <version>1.4.4</version>
            </dependency>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    简单使用:

    private static RuntimeSchema<Person> schema = RuntimeSchema.createFrom(Person.class);
    /**
    *序列化
    */
    Person crab = new Person();  
    crab.setName("kaka");  
    //参数三缓冲器
    byte[] bytes = ProtostuffIOUtil.toByteArray(crab,schema,LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE));
    /**
     *反序列化
     */
    // 空对象
    Person newCrab = schema.newMessage();
    ProtostuffIOUtil.mergeFrom(bytes,newCrab,schema);
    System.out.println("Hi, My name is " + newCrab.getName());
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    centos7下配置时间同步服务器
    交换机简单配置(转)
    ubuntu16.04安装docker CE
    docker下使用DB2
    iptables之centos6版本详解
    iptables之centos6版本常用设置
    iptables介绍iptables和netfilter
    git的使用学习(九)搭建git服务器
    js 图片预览
    ps -ef | grep java 查看所有关于java的进程
  • 原文地址:https://www.cnblogs.com/firstdream/p/7809357.html
Copyright © 2011-2022 走看看