package com.github.wangxuehui.rpc.serializer; import org.objenesis.Objenesis; import org.objenesis.ObjenesisStd; import com.dyuproject.protostuff.LinkedBuffer; import com.dyuproject.protostuff.Schema; public abstract class AbstractProtoSerializer implements Serializer, Deserializer { private final Objenesis objenesis = new ObjenesisStd( true ); @Override public <T> byte[] serialize( final T source ) { @SuppressWarnings( "unchecked" ) final Class<T> clazz = (Class<T>) source.getClass(); final LinkedBuffer buffer = LinkedBuffer.allocate( LinkedBuffer.DEFAULT_BUFFER_SIZE ); try { final Schema<T> schema = SchemaUtils.getSchema( clazz ); return serializeInternal( source, schema, buffer ); } catch ( final Exception e ) { throw new IllegalStateException( e.getMessage() , e ); } finally { buffer.clear(); } } @Override public <T> T deserialize( final byte[] bytes , final Class<T> clazz ) { try { final T result = (T) objenesis.newInstance( clazz ); return deserializeInternal( bytes, result, SchemaUtils.getSchema( clazz ) ); } catch ( final Exception e ) { throw new IllegalStateException( e.getMessage() , e ); } } public abstract <T> byte[] serializeInternal( final T source , final Schema<T> schema , final LinkedBuffer buffer ); public abstract <T> T deserializeInternal( final byte[] bytes , final T result , final Schema<T> schema ); }