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>