凡是离开内存的信息都要进行序列化java
序列化最终的目的是为了对象能够存储,和网络传输。进行存储和网络传输的方式就是IO,而IO支持的数据格式就是字节数组后端
只把对象转成(0和1的)字节数组还不行,由于没有规则的字节数组咱们是没办法把对象的原本面目还原回来的(即拿到一堆01可是并不知道这些01表明的含义),因此咱们必须在把对象转成字节数组的时候就制定一种规则(序列化),那么咱们从IO流里面读出数据的时候再以这种规则把对象还原回来(反序列化)数组
这就比如咱们要把一栋房子从一个地方运输到另外一个地方去,序列化就是我把房子拆成一个个的砖块放到车子里,而后留下一张房子原来结构的图纸,反序列化就是咱们把房子运输到了目的地之后,根据图纸把一块块砖头还原成房子原来面目的过程网络
对象并不仅是存在内存中,还须要传输网络,或者保存起来下次再加载出来用,因此须要Java序列化技术性能
序列化只是一种拆装组装对象的规则,那么这种规则确定也可能有多种多样,好比如今常见的序列化方式有:加密
JDK(不支持跨语言)、JSON、XML、Hessian/Hessian二、Kryo(不支持跨语言)、Thrift、Protobuf、FST(不支持跨语言)对象
问题一:static 属性不能被序列化继承
缘由:序列化保存的是对象的状态,静态变量属于类的状态,所以序列化并不保存静态变量。递归
问题二:Transient 属性不会被序列化接口
transient 关键字的做用是控制变量的序列化,在变量声明前加上该关键字,能够阻止该变量被序列化到文件中,在被反序列化后,transient 变量的值被设为初始值,如 int 型的是 0,对象型的是 null。
序列化一般会用于网络传输数据对象,而对象中经常会含有敏感数据,因此黑客经常会攻击这点,攻击手段一般是利用反序列化过程构造恶意代码,怎么应对这种状况呢?可使用transient关键字来修饰这个属性,这样在反序列化以后该属性就会为空,若是必定要传递的话,可使用对称加密或非对称加密独立传输
父类、子类序列化问题
序列化是以正向递归的形式进行的,若是父类实现了序列化那么其子类都将被序列化;子类实现了序列化而父类没实现序列化,那么只有子类的属性会进行序列化,而父类的属性是不会进行序列化的。
字节码(class)为了指导虚拟机的运行
两者都是具备必定组装规则的二机制流