美文网首页
序列化Serialize

序列化Serialize

作者: Jerry_4d84 | 来源:发表于2020-06-01 16:49 被阅读0次

为什么要序列化

在内存中,一个对象是不连续的,需要传输的时候需要将一个对象转换成连续的二进制流。

如何序列化?

public class Test implements Serializable {

    private int i = 1;

    public int getI() {
        return i;
    }

    public void setI(int i) {
        this.i = i;
    }
}

JSON

字符串

{"i":1}

二进制

[123, 34, 105, 34, 58, 49, 125]

占用字节数

占用了7个字节

缺点

  • 没有记录对象的class 反序列化无法区分 int long等

优点

  • 占用字节数一般
  • 阅读性高
  • 无关语言

JDK

实现Serializable,可以自己重写readObject,writeObject 方法,自定义序列化

十六级制

  Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F   
00000000: AC ED 00 05 73 72 00 13 74 65 73 74 2E 73 65 72    ,m..sr..test.ser
00000010: 69 61 6C 69 7A 65 2E 54 65 73 74 00 00 00 00 00    ialize.Test.....
00000020: 00 00 01 02 00 01 49 00 01 69 78 70 00 00 00 01    ......I..ixp....

阅读

第1部分是序列化文件头

  • AC ED:STREAM_MAGIC序列化协议
  • 00 05:STREAM_VERSION序列化协议版本
  • 73:TC_OBJECT声明这是一个新的对象

第2部分是要序列化的类的描述,在这里是SerializableObject类

  • 72:TC_CLASSDESC声明这里开始一个新的class
  • 00 13:十进制的19,表示class名字的长度是19个字节
  • 74 65 73 ... 65 73 74:表示的是“test.serialize.Test”这一串字符
  • 00 00 00 00 00 00 00 01:序列化版本,我们在这个类里面设置的值是1
  • 02:标记号,声明该对象支持序列化
  • 00 01:该类所包含的域的个数为1个

第3部分是对象中各个属性项的描述

  • 02:表示该属性是一个基础类型
  • 00 01十进制的1,表示属性名的长度
  • 49:字符串“i”,属性名

第4部分是该对象父类的信息 这里为空

  • 00 01:表示没有父类(这个还需要确认下)
  • 69 : (这个还需要确认下)
  • 78:TC_ENDBLOCKDATA,对象块结束的标志
  • 70:TC_NULL,说明没有其他超类的标志

第5部分输出对象的属性项的实际值

00 00 00 01:属性值 i=1

占用字节数

很多,不统计了

缺点

  • 序列化太大了
  • 仅仅java

优点

  • 记录了类名 ,反序列化不容易出错

Hessian2

十六级制

  Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F   
00000000: 43 13 74 65 73 74 2E 73 65 72 69 61 6C 69 7A 65    C.test.serialize
00000010: 2E 54 65 73 74 91 01 69 60 91 00 00 00 7A          .Test..i`....z

这里仔细阅读了,参照:http://hessian.caucho.com/doc/hessian-serialization.html
和jdk删了一些版本号,然后优化了一些细节的存储。所以更省空间。

相关文章

网友评论

      本文标题:序列化Serialize

      本文链接:https://www.haomeiwen.com/subject/biqszhtx.html