分布式服务架构学习(七):实现自己的序列化工具引擎(六)-序列化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>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值