Hessian源码学习(四)
之前分析了序列化一个对象的流程,基本上可以归纳成先获取一个对象的序列化类,然后由该序列化类来序列化对象;那么究竟有哪些序列化类,以及这些类是如何序列化的就是我们本次分析的重点!
先看下整个序列化类的的类图:
可以看出:
1.它们都是AbstractSerializer的子类;
2.实现序列化的方法是:void writeObject(Object obj, AbstractHessianOutput out)方法;
现在我们就分别讨论这些类的实现,首先是BasicSerializer类
当我们:
下面列下对于每个类型具体的输出代码(实现比较简单,我就不在赘述,可以参照我上面说的输出格式):// 输出booleanpublic void writeBoolean(boolean value) throws IOException{ if (value) os.write('T'); else os.write('F');}// 输出byte,short,int 都是用这个public void writeInt(int value) throws IOException{ os.write('I'); os.write(value >> 24); os.write(value >> 16); os.write(value >> 8); os.write(value);}// 输出longpublic void writeLong(long value) throws IOException{ os.write('L'); os.write((byte) (value >> 56)); os.write((byte) (value >> 48)); os.write((byte) (value >> 40)); os.write((byte) (value >> 32)); os.write((byte) (value >> 24)); os.write((byte) (value >> 16)); os.write((byte) (value >> 8)); os.write((byte) (value));}// 输出float,doublepublic void writeDouble(double value) throws IOException{ long bits = Double.doubleToLongBits(value); os.write('D'); os.write((byte) (bits >> 56)); os.write((byte) (bits >> 48)); os.write((byte) (bits >> 40)); os.write((byte) (bits >> 32)); os.write((byte) (bits >> 24)); os.write((byte) (bits >> 16)); os.write((byte) (bits >> 8)); os.write((byte) (bits));}// 输出datepublic void writeUTCDate(long time)throws IOException{os.write('d');os.write((byte) (time >> 56));os.write((byte) (time >> 48));os.write((byte) (time >> 40));os.write((byte) (time >> 32));os.write((byte) (time >> 24));os.write((byte) (time >> 16));os.write((byte) (time >> 8));os.write((byte) (time));}// 输出nullpublic void writeNull() throws IOException{ os.write('N');}// 输出字符串 public void writeString(String value) throws IOException{ if (value == null) { os.write('N'); } else { int length = value.length(); int offset = 0; while (length > 0x8000) { int sublen = 0x8000;// chunk can't end in high surrogatechar tail = value.charAt(offset + sublen - 1);if (0xd800 <= tail && tail <= 0xdbff) sublen--; os.write('s'); os.write(sublen >> 8); os.write(sublen); printString(value, offset, sublen); length -= sublen; offset += sublen;} os.write('S'); os.write(length >> 8); os.write(length); printString(value, offset, length); }}// 输出数组(集合)开始标记(eg:之前代码中 out.writeListBegin(data.length, "[long"); 就是写成: 'Vt[long' 'l' 数组长度)public boolean writeListBegin(int length, String type) throws IOException{ os.write('V'); if (type != null) { os.write('t'); printLenString(type); } if (length >= 0) { os.write('l'); os.write(length >> 24); os.write(length >> 16); os.write(length >> 8); os.write(length); } return true;}// 输出结束标志: 'z'public void writeListEnd()throws IOException{os.write('z');}