序列化⚡

java本身序列化机制问题

  • 1)序列化结果比较大、传输效率低
    1. 不能跨语言对接

由于上边的原因,早期xml编码就称为了序列化的主流,(1方面跨语言、2方面序列化后好理解) ,以至于基于xml的soap协议及对应的webService 框架在那一段时间比较流行

到现在json的简单文本格式编码的HTTP REST接口又基本上取代了复杂的Web Service 几口,称为了分布式架构的首要选择。json 出现的问题是(占的空间大、性能低),于是乎二进制的编码协议出现了MessagePack。

注意:恰当的选择序列化可以提供系统的通用性、健壮性、安全性、优化性能。同时还能让系统更加易于调试和扩展

序列化和反序列化的概念

1)把对象转化为字节序列的过程称为对象的序列化
2)反之😂,就是反序列化

怎么去实现一个序列化

1)实现Serializable接口
2) ObjectInputStream :
3)ObjectOutputStream :

问题

serialVersionUID的作用

反序列化的时候会比较序列后文件中的uid与定义在类中uid比较,不一样就报错。推荐手动写一个private的uid,默认生成的在类文件属性变更时会变化,可能导致反序列化出错

静态变量序列化

序列化并不保存静态变量的状态

transient关键字

类属性上加上transient,此属性不参与序列化

父子类问题

子类实现了序列化接口,父类没实现,那么父类的属性将不会被序列化

序列化后的存储问题

对同一个对象进行多次写入,第二次的存储结果比第一次多了5个字节,实际上是多了一个引用关系

深克隆和浅克隆

浅克隆: 被克隆的对象与原来的对象的值相同,所有的引用对象仍是指向原来的引用地址
深克隆: 被克隆的对象与原来的对象的值相同,所有的引用对象都会指向被复制过来的新对象,即,深拷贝把要复制的对象所引用的对象都复制了一遍

主流的序列化技术

JSON/Hession(2)/xml/protobuf/kryo/MsgPack/FST/thrift/protostuff/Avro

源码地址

github地址