package com.leansoft.luxun.serializer; import java.nio.ByteBuffer; import org.apache.thrift.TBase; import org.apache.thrift.TDeserializer; import org.apache.thrift.TException; import org.apache.thrift.TSerializer; @SuppressWarnings("rawtypes") public abstract class ThriftConverter { static ThreadLocalTSerializer tSerializerLocal = new ThreadLocalTSerializer(); static ThreadLocalTDeserializer tDeserializerLocal = new ThreadLocalTDeserializer(); static class ThreadLocalTSerializer extends ThreadLocal<TSerializer> { @Override protected synchronized TSerializer initialValue() { return new TSerializer(); } } static class ThreadLocalTDeserializer extends ThreadLocal<TDeserializer> { @Override protected synchronized TDeserializer initialValue() { return new TDeserializer(); } } public static TBase toEvent(byte[] data, Class<? extends TBase> clazz) { TBase tBase; try { tBase = clazz.newInstance(); TDeserializer tDeserializer = tDeserializerLocal.get(); tDeserializer.deserialize(tBase, data); } catch (Exception e) { throw new RuntimeException("fail to deserialize into thrift object of type " + clazz, e); } return tBase; } public static TBase toEvent(ByteBuffer buffer, Class<? extends TBase> clazz) { byte[] data = new byte[buffer.remaining()]; buffer.get(data); return toEvent(data, clazz); } public static byte[] toBytes(TBase event) { TSerializer tSerializer = tSerializerLocal.get(); byte[] data; try { data = tSerializer.serialize(event); } catch (TException e) { throw new RuntimeException("fail to serialize thrift object of type " + event.getClass()); } return data; } public static ByteBuffer toBuffer(TBase event) { return ByteBuffer.wrap(toBytes(event)); } }