序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
需要序列化的情况:
当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
当你想用套接字在网络上传送对象的时候;
当你想通过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); } } } } }