序列化与反序列化之Kryo

 

序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

 

需要序列化的情况:

当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
当你想用套接字在网络上传送对象的时候;
当你想通过RMI传输对象的时候;

 

Kryo 是一个快速高效的Java对象图形序列化框架,主要特点是性能、高效和易用。该项目用来序列化对象到文件、数据库或者网络。

序列化工具类

package com.ai.toptea.itsm.imp.util;

import org.apache.commons.pool2.ObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPool;

import com.ai.toptea.common.log.TopteaLogger;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;

public class SerializeUtil {
    
    private static TopteaLogger logger = TopteaLogger.getLogger(SerializeUtil.class);

    public static final int BUFFER_SIZE = 2048;
    public static final int MAX_BUFFER_SIZE = 10485760;
    
    private  static ObjectPool<Kryo> kryo_pool;
    
    static{
        kryo_pool = new GenericObjectPool<Kryo>(new KryoFactory());
    }
    
    public static byte[] serialize(Object t) throws Exception{
        Kryo kryo = null;
        Output output = null;
        try{
            kryo = kryo_pool.borrowObject();
            output = new Output(BUFFER_SIZE, MAX_BUFFER_SIZE);
            kryo.writeClassAndObject(output, t);
            return output.toBytes();
            
        }catch(Exception e){
            logger.error("异常", e);
            throw e;
        }finally{
            if(output != null){
                try {
                    output.close();
                    output = null;
                } catch (Exception e) {
                    logger.error("异常", e);
                }
            }
            if(kryo != null){
                try {
                    kryo_pool.returnObject(kryo);
                } catch (Exception e) {
                    logger.error("异常", e);
                }
            }
        }
    }
    
    public static Object deserialize(byte[] bytes) throws Exception{
        Kryo kryo = null;
        Input input = null;
        try{
            kryo = kryo_pool.borrowObject();
            input = new Input(bytes);
            Object t = kryo.readClassAndObject(input);
            return t;
        }catch(Exception e){
            logger.error("异常", e);
            throw e;
        }finally{
            if(input != null){
                try {
                    input.close();
                    input = null;
                } catch (Exception e) {
                    logger.error("异常", e);
                }
            }
            if(kryo != null){
                try {
                    kryo_pool.returnObject(kryo);
                } catch (Exception e) {
                    logger.error("异常", e);
                }
            }
        }
    }
}

 

posted @ 2018-05-17 11:16  三尺墨  阅读(2814)  评论(0编辑  收藏  举报