// Path: src/main/java/com/baidu/unbiz/multiengine/codec/MsgCodec.java
// public interface MsgCodec {
//     /**
//      * 反序列化
//      *
//      * @param clazz 反序列化后的类定义
//      * @param bytes 字节码
//      * @return 反序列化后的对象
//      * @throws CodecException
//      */
//      <T> T decode(Class<T> clazz, byte[] bytes) throws CodecException;
// 
//     /**
//      * 序列化
//      *
//      * @param object 待序列化的对象
//      * @return 字节码
//      * @throws CodecException
//      */
//     <T> byte[] encode(T object) throws CodecException;
// }
// 
// Path: src/main/java/com/baidu/unbiz/multiengine/exception/CodecException.java
// public class CodecException extends RuntimeException {
// 
//     /**
//      * serialVersionUID
//      */
//     private static final long serialVersionUID = 5196421433506179782L;
// 
//     /**
//      * Creates a new instance of CodecException.
//      */
//     public CodecException() {
//         super();
//     }
// 
//     /**
//      * Creates a new instance of CodecException.
//      * 
//      * @param arg0
//      * @param arg1
//      */
//     public CodecException(String arg0, Throwable arg1) {
//         super(arg0, arg1);
//     }
// 
//     /**
//      * Creates a new instance of CodecException.
//      * 
//      * @param arg0
//      */
//     public CodecException(String arg0) {
//         super(arg0);
//     }
// 
//     /**
//      * Creates a new instance of CodecException.
//      * 
//      * @param arg0
//      */
//     public CodecException(Throwable arg0) {
//         super(arg0);
//     }
// 
// }


import java.lang.reflect.Method;
import java.util.concurrent.Callable;
import com.baidu.unbiz.devlib.cache.AtomicComputeCache;
import com.baidu.unbiz.multiengine.codec.MsgCodec;
import com.baidu.unbiz.multiengine.exception.CodecException;
import com.google.protobuf.GeneratedMessage;
            if (data == null || data.length == 0) {
                return null;
            }
            Method m = PROTOBUF_METHOD_CACHE.getComputeResult(clazz.getName() + METHOD_NAME_PARSEFROM,
                    new Callable<Method>() {
                        @Override
                        public Method call() throws Exception {
                            return clazz.getMethod(METHOD_NAME_PARSEFROM, byte[].class);
                        }
                    });
            GeneratedMessage msg = (GeneratedMessage) m.invoke(clazz, data);
            return (T) msg;
        } catch (Exception e) {
            throw new CodecException("Decode failed due to " + e.getMessage(), e);
        }
    }


    @Override
    public <T> byte[] encode(T object) throws CodecException {
        try {
            final Class<?> clazz = object.getClass();
            Method m = PROTOBUF_METHOD_CACHE.getComputeResult(clazz.getName() + METHOD_NAME_TOBYTE,
                    new Callable<Method>() {
                        @Override
                        public Method call() throws Exception {
                            return clazz.getMethod(METHOD_NAME_TOBYTE);
                        }
                    });
            byte[] data = (byte[]) m.invoke(object);
// Path: src/main/java/com/baidu/unbiz/multiengine/codec/MsgCodec.java
// public interface MsgCodec {
//     /**
//      * 反序列化
//      *
//      * @param clazz 反序列化后的类定义
//      * @param bytes 字节码
//      * @return 反序列化后的对象
//      * @throws CodecException
//      */
//      <T> T decode(Class<T> clazz, byte[] bytes) throws CodecException;
// 
//     /**
//      * 序列化
//      *
//      * @param object 待序列化的对象
//      * @return 字节码
//      * @throws CodecException
//      */
//     <T> byte[] encode(T object) throws CodecException;
// }
// 
// Path: src/main/java/com/baidu/unbiz/multiengine/exception/CodecException.java
// public class CodecException extends RuntimeException {
// 
//     /**
//      * serialVersionUID
//      */
//     private static final long serialVersionUID = 5196421433506179782L;
// 
//     /**
//      * Creates a new instance of CodecException.
//      */
//     public CodecException() {
//         super();
//     }
// 
//     /**
//      * Creates a new instance of CodecException.
//      * 
//      * @param arg0
//      * @param arg1
//      */
//     public CodecException(String arg0, Throwable arg1) {
//         super(arg0, arg1);
//     }
// 
//     /**
//      * Creates a new instance of CodecException.
//      * 
//      * @param arg0
//      */
//     public CodecException(String arg0) {
//         super(arg0);
//     }
// 
//     /**
//      * Creates a new instance of CodecException.
//      * 
//      * @param arg0
//      */
//     public CodecException(Throwable arg0) {
//         super(arg0);
//     }
// 
// }


// Path: src/main/java/com/baidu/unbiz/multiengine/codec/common/ProtobufCodec.java
import java.lang.reflect.Method;
import java.util.concurrent.Callable;
import com.baidu.unbiz.devlib.cache.AtomicComputeCache;
import com.baidu.unbiz.multiengine.codec.MsgCodec;
import com.baidu.unbiz.multiengine.exception.CodecException;
import com.google.protobuf.GeneratedMessage;

            if (data == null || data.length == 0) {
                return null;
            }
            Method m = PROTOBUF_METHOD_CACHE.getComputeResult(clazz.getName() + METHOD_NAME_PARSEFROM,
                    new Callable<Method>() {
                        @Override
                        public Method call() throws Exception {
                            return clazz.getMethod(METHOD_NAME_PARSEFROM, byte[].class);
                        }
                    });
            GeneratedMessage msg = (GeneratedMessage) m.invoke(clazz, data);
            return (T) msg;
        } catch (Exception e) {
            throw new CodecException("Decode failed due to " + e.getMessage(), e);
        }
    }


    @Override
    public <T> byte[] encode(T object) throws CodecException {
        try {
            final Class<?> clazz = object.getClass();
            Method m = PROTOBUF_METHOD_CACHE.getComputeResult(clazz.getName() + METHOD_NAME_TOBYTE,
                    new Callable<Method>() {
                        @Override
                        public Method call() throws Exception {
                            return clazz.getMethod(METHOD_NAME_TOBYTE);
                        }
                    });
            byte[] data = (byte[]) m.invoke(object);
            return data;