FST实现序列化
/** * 使用 FST 实现序列化 * * @author winterlau */ public class FSTSerializer implements Serializer { @Override public String name() { return "fst"; } @Override public byte[] serialize(Object obj) throws IOException { ByteArrayOutputStream out = null; FSTObjectOutput fout = null; try { out = new ByteArrayOutputStream(); fout = new FSTObjectOutput(out); fout.writeObject(obj); return out.toByteArray(); } finally { if (fout != null) try { fout.close(); } catch (IOException e) { } } } @Override public Object deserialize(byte[] bytes) throws IOException { if (bytes == null || bytes.length == 0) return null; FSTObjectInput in = null; try { in = new FSTObjectInput(new ByteArrayInputStream(bytes)); return in.readObject(); } catch (ClassNotFoundException e) { throw new CacheException(e); } finally { if (in != null) try { in.close(); } catch (IOException e) { } } } }
原生的java序列话
/** * 标准的 Java 序列化 * * @author winterlau */ public class JavaSerializer implements Serializer { @Override public String name() { return "java"; } @Override public byte[] serialize(Object obj) throws IOException { ObjectOutputStream oos = null; try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); oos = new ObjectOutputStream(baos); oos.writeObject(obj); return baos.toByteArray(); } finally { if (oos != null) try { oos.close(); } catch (IOException e) { } } } @Override public Object deserialize(byte[] bits) throws IOException { if (bits == null || bits.length == 0) return null; ObjectInputStream ois = null; try { ByteArrayInputStream bais = new ByteArrayInputStream(bits); ois = new ObjectInputStream(bais); return ois.readObject(); } catch (ClassNotFoundException e) { throw new CacheException(e); } finally { if (ois != null) try { ois.close(); } catch (IOException e) { } } } }
kryo序列话方式:
/** * Created by chenlei on 14-9-28. */ public class KryoPoolSerializer implements Serializer{ /** * Kryo 的包装 */ private static class KryoHolder { private Kryo kryo; static final int BUFFER_SIZE = 1024; private Output output = new Output(BUFFER_SIZE, -1); //reuse private Input input = new Input(); KryoHolder(Kryo kryo) { this.kryo = kryo; } } interface KryoPool { /** * get o kryo object * @return KryoHolder instance */ KryoHolder get(); /** * return object * @param kryo holder */ void offer(KryoHolder kryo); } /** * 由于kryo创建的代价相对较高 ,这里使用空间换时间 * 对KryoHolder对象进行重用 */ public static class KryoPoolImpl implements KryoPool { /** * default is 1500 * online server limit 3K */ /** * thread safe list */ private final Deque<KryoHolder> kryoHolderDeque=new ConcurrentLinkedDeque<KryoHolder>(); private KryoPoolImpl() { } /** * @return KryoPool instance */ public static KryoPool getInstance() { return Singleton.pool; } /** * get o KryoHolder object * * @return KryoHolder instance */ @Override public KryoHolder get() { KryoHolder kryoHolder = kryoHolderDeque.pollFirst(); // Retrieves and removes the head of the queue represented by this table return kryoHolder == null ? creatInstnce() : kryoHolder; } /** * create a new kryo object to application use * @return KryoHolder instance */ public KryoHolder creatInstnce() { Kryo kryo = new Kryo(); kryo.setReferences(false);// return new KryoHolder(kryo); } /** * return object * Inserts the specified element at the tail of this queue. * * @param kryoHolder ... */ @Override public void offer(KryoHolder kryoHolder) { kryoHolderDeque.addLast(kryoHolder); } /** * creat a Singleton */ private static class Singleton { private static final KryoPool pool = new KryoPoolImpl(); } } @Override public String name() { return "kryo_pool_ser"; } /** * Serialize object * @param obj what to serialize * @return return serialize data */ @Override public byte[] serialize(Object obj) throws IOException { KryoHolder kryoHolder = null; if (obj == null) throw new CacheException("obj can not be null"); try { kryoHolder = KryoPoolImpl.getInstance().get(); kryoHolder.output.clear(); //clear Output -->每次调用的时候 重置 kryoHolder.kryo.writeClassAndObject(kryoHolder.output, obj); return kryoHolder.output.toBytes();// 无法避免拷贝 ~~~ } catch (CacheException e) { throw new CacheException("Serialize obj exception"); } finally { KryoPoolImpl.getInstance().offer(kryoHolder); obj = null; //GC } } /** * Deserialize data * @param bytes what to deserialize * @return object */ @Override public Object deserialize(byte[] bytes) throws IOException { KryoHolder kryoHolder = null; if (bytes == null) throw new CacheException("bytes can not be null"); try { kryoHolder = KryoPoolImpl.getInstance().get(); kryoHolder.input.setBuffer(bytes, 0, bytes.length);//call it ,and then use input object ,discard any array return kryoHolder.kryo.readClassAndObject(kryoHolder.input); } catch (CacheException e) { throw new CacheException("Deserialize bytes exception"); } finally { KryoPoolImpl.getInstance().offer(kryoHolder); bytes = null; // for gc } } }
/** * 使用 Kryo 实现序列化 * @author winterlau */ public class KryoSerializer implements Serializer { private final static Kryo kryo = new Kryo(); @Override public String name() { return "kryo"; } @Override public byte[] serialize(Object obj) throws IOException { Output output = null; try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); output = new Output(baos); kryo.writeClassAndObject(output, obj); output.flush(); return baos.toByteArray(); }finally{ if(output != null) output.close(); } } @Override public Object deserialize(byte[] bits) throws IOException { if(bits == null || bits.length == 0) return null; Input ois = null; try { ByteArrayInputStream bais = new ByteArrayInputStream(bits); ois = new Input(bais); return kryo.readClassAndObject(ois); } finally { if(ois != null) ois.close(); } } }