dubbo序列化源码分析1-序列化接口设计

分析 dubbo 序列化实现 
选中几个协议分析 源码  必选FastJson, jdk  hessian2, msgpack  
主流 序列化协议性能对比

先找个简单的分析FastJsonSerialization

dubbo FastJson序列化

public class FastJsonSerialization implements Serialization {

    @Override
    public byte getContentTypeId() { //获取协议ID
        return 6;
    }

    @Override
    public String getContentType() {//协议类型
        return "text/json";
    }

    @Override
    public ObjectOutput serialize(URL url, OutputStream output) throws IOException {
        return new FastJsonObjectOutput(output);//创建ObjectOutput 
    }

    @Override
    public ObjectInput deserialize(URL url, InputStream input) throws IOException {
        return new FastJsonObjectInput(input);//创建ObjectInput 
    }

用到 serialize的位置如下


以encodeRequest为例
执行 序列化的地方
   encodeRequestData(channel, out, req.getData());

    protected void encodeResponseData(ObjectOutput out, Object data) throws IOException {
        out.writeObject(data);
    }
最后序列化调用的是 ObjectOutput.writeObject(data);对应 fastjson类型 就是FastJsonObjectOutput.writeObject(data);

Serialization.deserialize 在 DecodeableRpcResult.decode(Channel, InputStream) 中调用

      Type[] returnType = RpcUtils.getReturnTypes(invocation);
                    setValue(returnType == null || returnType.length == 0 ? in.readObject() :
                            (returnType.length == 1 ? in.readObject((Class<?>) returnType[0])
                                    : in.readObject((Class<?>) returnType[0], returnType[1])));

对应 fastjson类型 就是FastJsonObjectInput.readObject()

下面需要搞清楚 FastJsonObjectOutput.writeObject(data); FastJsonObjectInput.readObject()都干了什么
先画出 类图


DataOutput: 与OutputStream 定义相似,定义了 写入基本类型,String, byte[] 和flushBuffer 方法。 
DataInput:与InputStream定义相似,定义了 读出基本类型,String, byte[]方法

ObjectOutput:定义了写入 Object的方法
ObjectInput:定义了读出Object的方法, 无参数读出Object, 根据Class读出Object,根据Class和Type读出

FastJsonObjectOutput.writeBool(boolean)  
    public void writeBool(boolean v) throws IOException {
        writeObject(v);
    }
FastJsonObjectOutput.writeObject(Object)      
使用FastJson完成序列化
   public void writeObject(Object obj) throws IOException {
        SerializeWriter out = new SerializeWriter();
        JSONSerializer serializer = new JSONSerializer(out);
        serializer.config(SerializerFeature.WriteEnumUsingToString, true);
        serializer.write(obj);
        out.writeTo(writer);
        out.close(); // for reuse SerializeWriter buf
        writer.println();//注意 这里写入了换行符
        writer.flush();// 最后调用 ByteArrayOutputStream 的flush(),啥也没干
    }

总结:dubbo FastJson 依赖原生 FastJson实现。

dubbo java序列化

NativeJava 系列方法 直接 调用java序列化

JavaObjectOutput
    public void writeObject(Object obj) throws IOException {
        if (obj == null) {
            getObjectOutputStream().writeByte(0);
        } else {
            getObjectOutputStream().writeByte(1);
            getObjectOutputStream().writeObject(obj);
        }
    }

NativeJavaObjectOutput

   public void writeObject(Object obj) throws IOException {
        outputStream.writeObject(obj);
    }

JavaObjectInput
    public Object readObject() throws IOException, ClassNotFoundException {
        byte b = getObjectInputStream().readByte();
        if (b == 0)
            return null;

        return getObjectInputStream().readObject();
    }

NativeJavaObjectInput
  public Object readObject() throws IOException, ClassNotFoundException {
        return inputStream.readObject();
    }

JavaObjectOutput,JavaObjectInput在原生 的基础上 增加了对null对象的处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值