序列化潜规则
- 序列化的对象必须实现Serializable接口
- 序列化与反序列化的版本号不一致会报错
- 序列化与反序列化的字段不同不会报错,只是反序列化字段多余的会是null,缺少的就缺少了
- 静态变量不参与序列化
- transient关键字修饰的字段不会参与序列化
- 子类实现序列化但是父类没有,那么父类的字段不能被序列化会是null,但是父类实现序列化,子类不实现,那就可以全部序列化
- 可以通过writeObject()和readObject()方法手动实现序列化
- 同一个对象被序列化两次以后,数据大小会增长5个字节,这5个字节就是多出来的引用,指向的是同一个对象内存地址
- 序列化可以实现克隆,实现Cloneable接口,浅克隆只会克隆对象本身的属性和依赖的对象的引用,而不会克隆依赖对象本身,深克隆不仅会克隆对象本身还会克隆依赖的对象本身(相当于重新开辟了一份空间)
序列化技术:
了解更多可以点这里
java自带的
实现Serializable接口,通过二进制流
webservice技术形式
通过http+xml实现,
优点:可读性高
缺点:字节码比较大,效率不高
jackson / fastjson / gson
相对来说jackson比fastjson要快,比gson性能要好,但是jackson和gson的稳定性要比fastjson好
hession2
dubbo默认的
protobuf
独立语言,独立平台
优势:跨平台,空间压缩和性能都很好,解析性能也很高
缺点:实现很麻烦,学习成本高
varint去编码(基于位图做的),然后用TLV方式去存储数据,tag-length-value,底层就是位运算算法
thrift
avro
kryo
messagepack
fst
…