序列化:把對象轉換為字節序列的過程稱為對象的序列化。
反序列化:把字節序列恢復為對象的過程稱為對象的反序列化。
需要序列化的情況:
當你想把的內存中的對象狀態保存到一個文件中或者數據庫中時候;
當你想用套接字在網絡上傳送對象的時候;
當你想通過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); } } } } }