分佈式服務架構學習(七):實現自己的序列化工具引擎(六)-序列化protobuf實現

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>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章