首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

Hessian源码学习(4)

2012-06-27 
Hessian源码学习(四)之前分析了序列化一个对象的流程,基本上可以归纳成先获取一个对象的序列化类,然后由该

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');}

热点排行