dubbo源码分析-dubbo-serialization

dubbo-serialization

dubbo-serialization是dubbo中实现序列化相关的代码。
这里写图片描述

共5种序列化方式,可从名字直接看出含义,这里不再赘述。

  • dubbo-serialization-fastjson
  • dubbo-serialization-fst
  • dubbo-serialization-hessian2
  • dubbo-serialization-jdk
  • dubbo-serialization-kryo

dubbo-serialization-api

dubbo-serialization-api是底层实现,上述5种序列化方式均封装dubbo-serialization-api。
这里写图片描述
其中SerializableClassRegistry和SerializationOptimizer两个接口,未在源码中找到实现和引用。

  • Cleanable

Cleanable是供Kryo序列化方式使用,源码如下:

package org.apache.dubbo.common.serialize;

public interface Cleanable {

    void cleanup();
}

在KryoObjectInput中实现如下:

    @Override
    public void cleanup() {
        KryoUtils.release(kryo);
        kryo = null;
    }
  • DataInput
    DataInput实现了基本类型的读取。

    package org.apache.dubbo.common.serialize;

    import java.io.IOException;

    /**

    • Data input.
      */
      public interface DataInput {

      /**

      • Read boolean.
      • @return boolean.
      • @throws IOException
        */
        boolean readBool() throws IOException;

      /**

      • Read byte.
      • @return byte value.
      • @throws IOException
        */
        byte readByte() throws IOException;

      /**

      • Read short integer.
      • @return short.
      • @throws IOException
        */
        short readShort() throws IOException;

      /**

      • Read integer.
      • @return integer.
      • @throws IOException
        */
        int readInt() throws IOException;

      /**

      • Read long.
      • @return long.
      • @throws IOException
        */
        long readLong() throws IOException;

      /**

      • Read float.
      • @return float.
      • @throws IOException
        */
        float readFloat() throws IOException;

      /**

      • Read double.
      • @return double.
      • @throws IOException
        */
        double readDouble() throws IOException;

      /**

      • Read UTF-8 string.
      • @return string.
      • @throws IOException
        */
        String readUTF() throws IOException;

      /**

      • Read byte array.
      • @return byte array.
      • @throws IOException
        */
        byte[] readBytes() throws IOException;
        }
  • DataOutput
    DataOutput实现了基本类型的写入。

    package org.apache.dubbo.common.serialize;

    import java.io.IOException;

    /**

    • Data output.
      */
      public interface DataOutput {

      /**

      • Write boolean.
      • @param v value.
      • @throws IOException
        */
        void writeBool(boolean v) throws IOException;

      /**

      • Write byte.
      • @param v value.
      • @throws IOException
        */
        void writeByte(byte v) throws IOException;

      /**

      • Write short.
      • @param v value.
      • @throws IOException
        */
        void writeShort(short v) throws IOException;

      /**

      • Write integer.
      • @param v value.
      • @throws IOException
        */
        void writeInt(int v) throws IOException;

      /**

      • Write long.
      • @param v value.
      • @throws IOException
        */
        void writeLong(long v) throws IOException;

      /**

      • Write float.
      • @param v value.
      • @throws IOException
        */
        void writeFloat(float v) throws IOException;

      /**

      • Write double.
      • @param v value.
      • @throws IOException
        */
        void writeDouble(double v) throws IOException;

      /**

      • Write string.
      • @param v value.
      • @throws IOException
        */
        void writeUTF(String v) throws IOException;

      /**

      • Write byte array.
      • @param v value.
      • @throws IOException
        */
        void writeBytes(byte[] v) throws IOException;

      /**

      • Write byte array.
      • @param v value.
      • @param off offset.
      • @param len length.
      • @throws IOException
        */
        void writeBytes(byte[] v, int off, int len) throws IOException;

      /**

      • Flush buffer.
      • @throws IOException
        */
        void flushBuffer() throws IOException;
        }
  • ObjectInput
    ObjectInput实现了对象的读取,继承DataInput。

    package org.apache.dubbo.common.serialize;

    import java.io.IOException;
    import java.lang.reflect.Type;

    /**

    • Object input.
      */
      public interface ObjectInput extends DataInput {

      /**

      • read object.
      • @return object.
        */
        Object readObject() throws IOException, ClassNotFoundException;

      /**

      • read object.
      • @param cls object type.
      • @return object.
        */
        T readObject(Class cls) throws IOException, ClassNotFoundException;

      /**

      • read object.
      • @param cls object type.
      • @return object.
        */
        T readObject(Class cls, Type type) throws IOException, ClassNotFoundException;

    }

  • ObjectOutput
    ObjectOutput实现了对象的写入,继承DataOutput。

    package org.apache.dubbo.common.serialize;

    import java.io.IOException;

    /**

    • Object output.
      */
      public interface ObjectOutput extends DataOutput {

      /**

      • write object.
      • @param obj object.
        */
        void writeObject(Object obj) throws IOException;

    }

  • Serialization
    Serialization序列化接口。

    package org.apache.dubbo.common.serialize;

    import org.apache.dubbo.common.URL;
    import org.apache.dubbo.common.extension.Adaptive;
    import org.apache.dubbo.common.extension.SPI;

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;

    /**

    • Serialization. (SPI, Singleton, ThreadSafe)
      */
      @SPI(“hessian2”)
      public interface Serialization {

      /**

      • get content type id
      • @return content type id
        */
        byte getContentTypeId();

      /**

      • get content type
      • @return content type
        */
        String getContentType();

      /**

      • create serializer
      • @param url
      • @param output
      • @return serializer
      • @throws IOException
        */
        @Adaptive
        ObjectOutput serialize(URL url, OutputStream output) throws IOException;

      /**

      • create deserializer
      • @param url
      • @param input
      • @return deserializer
      • @throws IOException
        */
        @Adaptive
        ObjectInput deserialize(URL url, InputStream input) throws IOException;

    }

dubbo-serialization-fastjson

用最简单的dubbo-serialization-fastjson来实例分析。
这里写图片描述

  • FastJsonSerialization

    package org.apache.dubbo.common.serialize.fastjson;

    import org.apache.dubbo.common.URL;
    import org.apache.dubbo.common.serialize.ObjectInput;
    import org.apache.dubbo.common.serialize.ObjectOutput;
    import org.apache.dubbo.common.serialize.Serialization;

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;

    public class FastJsonSerialization implements Serialization {

    @Override
    public byte getContentTypeId() {
        return 6;
    }
    
    @Override
    public String getContentType() {
        return "text/json";
    }
    
    // 序列化
    @Override
    public ObjectOutput serialize(URL url, OutputStream output) throws IOException {
        // 返回FastJsonObjectOutput实例
        return new FastJsonObjectOutput(output);
    }
    
    // 反序列化
    @Override
    public ObjectInput deserialize(URL url, InputStream input) throws IOException {
        // 返回FastJsonObjectInput实例
        return new FastJsonObjectInput(input);
    }
    

    }

  • FastJsonObjectInput
    FastJsonObjectInput,文件读取,主要方法如下:

    @Override
    public Object readObject() throws IOException, ClassNotFoundException {
    String json = readLine();
    return JSON.parse(json);
    }

    @Override
    @SuppressWarnings("unchecked")
    public <T> T readObject(Class<T> cls, Type type) throws IOException, ClassNotFoundException {
        Object value = readObject(cls);
        return (T) PojoUtils.realize(value, cls, type);
    }
    
    private <T> T read(Class<T> cls) throws IOException {
        String json = readLine();
        return JSON.parseObject(json, cls);
    }
    
  • FastJsonObjectOutput
    FastJsonObjectOutput,文件写入,主要方法如下:

    @Override
    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();
    }
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值