protobuf是Google的一种数据交换格式,它独立于语言,独立于平台。它是一个纯粹的展示层协议,可以和各种传输层协议一起使用,它的文档也非常完善。
protobuf具有广泛的用户基础,空间开销小及高解析性能是其亮点,非常适合于公司内部对性能要求高的RPC调用。由于其解析性能高,序列化后数据量相对少,也适合应用层的持久化场景。
它的主要问题在于需要编写.proto IDL文件,使用起来工作量稍大,且需要额外学习proto IDL特有的语法,增加了额外学习的成本。
为了方便,本人利用java反射抽取了一个protobuf对象序列化/反序列化的通用方法。代码如下:
package ares.remoting.framework.serialization.serializer.impl;
import ares.remoting.framework.serialization.serializer.ISerializer;
import org.apache.commons.lang3.reflect.MethodUtils;
/**
* @author fuss created on 18/7/23.
* @version $Id$
*/
public class ProtocolBufferSerializer implements ISerializer {
public <T> byte[] serialize(T obj) {
try {
return (byte[]) MethodUtils.invokeMethod(obj, "toByteArray");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public <T> T deserialize(byte[] data, Class<T> cls) {
try {
Object o = MethodUtils.invokeStaticMethod(cls, "getDefaultInstance");
return (T) MethodUtils.invokeMethod(o, "parseFrom", new Object[]{data});
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
其中protobuf及apache.commons的Maven依赖配置如下:
!-- protobuf -->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.1</version>
</dependency>