class GrpcPbSerialization implements Serialization {
    @Override
    public byte[] serialize(Object obj) throws IOException {
        if (obj == null) {
            throw new IllegalArgumentException("can't serialize null.");
        }
        if (MessageLite.class.isAssignableFrom(obj.getClass())) {
            return ((MessageLite) obj).toByteArray();
        } else {
            throw new IllegalArgumentException("can't serialize " + obj.getClass());
        }
    }

    @SuppressWarnings("unchecked")
    @Override
    public <T> T deserialize(byte[] bytes, Class<T> clazz) throws IOException {
        if (MessageLite.class.isAssignableFrom(clazz)) {
            try {
                ByteArrayInputStream input = new ByteArrayInputStream(bytes);
                Method method = clazz.getDeclaredMethod("parseFrom", java.io.InputStream.class);
                return (T) method.invoke(null, input);
            } catch (Exception e) {
                throw new MotanFrameworkException(e);
            }
        } else {
            throw new IllegalArgumentException("can't serialize " + clazz);
        }
    }


    @Override
    public byte[] serializeMulti(Object[] data) throws IOException {
        if (data.length == 1) {
            return serialize(data[0]);
        }
        throw new MotanServiceException("GrpcPbSerialization not support serialize multi Object");
    }

    @Override
    public Object[] deserializeMulti(byte[] data, Class<?>[] classes) throws IOException {<FILL_FUNCTION_BODY>}

    @Override
    public int getSerializationNumber() {
        return 1;
    }
}

        if (classes.length != 1) {
            throw new MotanServiceException("only single value serialize was supported in GrpcPbSerialization");
        }
        Object[] objects = new Object[1];
        objects[0] = deserialize(data, classes[0]);
        return objects;
    
<no_super_class>