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