序列化與反序列化之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);
                }
            }
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM