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
  • 相关阅读:
    Android 开发 深入理解Handler、Looper、Messagequeue 转载
    Android 开发 Handler的基本使用
    Java 学习 注解
    Android 开发 AlarmManager 定时器
    Android 开发 框架系列 百度语音合成
    Android 开发 框架系列 Google的ORM框架 Room
    Android 开发 VectorDrawable 矢量图 (三)矢量图动画
    Android 开发 VectorDrawable 矢量图 (二)了解矢量图属性与绘制
    Android 开发 VectorDrawable 矢量图 (一)了解Android矢量图与获取矢量图
    Android 开发 知晓各种id信息 获取线程ID、activityID、内核ID
  • 原文地址:https://www.cnblogs.com/firstdream/p/7809357.html
Copyright © 2011-2022 走看看