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

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

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

先找个简单的分析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的位置如下

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


以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()都干了什么
先画出 类图

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


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对象的处理