// 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;
package com.baidu.unbiz.multiengine.codec.common;



/**
 * ClassName: ProtobufCodec <br/>
 * Function: protobuf序列化器，利用反射缓存<tt>method</tt>来进行调用
 *
 */
public class ProtobufCodec implements MsgCodec {

    /**
     * Protobuf生成原生Java代码中的方法解码方法名称
     */
    private static final String METHOD_NAME_PARSEFROM = "parseFrom";

    /**
     * Protobuf生成原生Java代码中的方法编码方法名称
     */
    private static final String METHOD_NAME_TOBYTE = "toByteArray";

    /**
     * 方法缓存，用于Protobuf生成原生Java代码中的某些编解码方法。 缓存的方法包括:
     */
    private static final AtomicComputeCache<String, Method> PROTOBUF_METHOD_CACHE =
            new AtomicComputeCache<String, Method>();


    @Override
// 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;

package com.baidu.unbiz.multiengine.codec.common;



/**
 * ClassName: ProtobufCodec <br/>
 * Function: protobuf序列化器，利用反射缓存<tt>method</tt>来进行调用
 *
 */
public class ProtobufCodec implements MsgCodec {

    /**
     * Protobuf生成原生Java代码中的方法解码方法名称
     */
    private static final String METHOD_NAME_PARSEFROM = "parseFrom";

    /**
     * Protobuf生成原生Java代码中的方法编码方法名称
     */
    private static final String METHOD_NAME_TOBYTE = "toByteArray";

    /**
     * 方法缓存，用于Protobuf生成原生Java代码中的某些编解码方法。 缓存的方法包括:
     */
    private static final AtomicComputeCache<String, Method> PROTOBUF_METHOD_CACHE =
            new AtomicComputeCache<String, Method>();


    @Override
    public <T> T decode(final Class<T> clazz, byte[] data) throws CodecException {