【其他】java序列化详解Serializable

Serializable- 序列化详解

测试代码:https://github.com/a982338665/Serializable

1.serialVersionUID–>适用于Java的序列化机制:

1.Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的
2.反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化
3.就会出现序列化版本不一致的异常,即是InvalidCastException

2.具体化序列化过程:

1.序列化:当前类的serialVersionUID写入到序列化文件中
2.反序列化:检测文件中的serialVersionUID,判断是否与当前类的serialVersionUID一致
    --1.serialVersionUID一致:可以反序列化成功
    --2.serialVersionUID不一致:InvalidCastException

3.serialVersionUID有两种显示的生成方式:

1.指定值:private static final long serialVersionUID = 1L; 
2.默认值:-->根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段
    --1.因此,要想反序列化成功,且不指定serialVersionUID,则包名,类名等均要一致

4.序列化测试:

1.A-:显式指定序列化Id --同类同包
    success
2.B-:将序列化id的创建交由jvm(根据类名等元素),-->同类同包
    success
3.C-:显式指定序列化Id相同,不同类不同包
    fail:ClassCastException: pers.li.seri.entity.CPerson cannot be cast to pers.li.seri.entity2.CPerson2
4.D-:显式指定序列化Id相同,同类名不同包
    fail:ClassCastException: pers.li.seri.entity.DPerson cannot be cast to pers.li.seri.entity2.DPerson
5.other-01:同包同类Person serialVersionUID使用默认或指定不变 --A端含age,B端不含age
    --1.序列化前:新增字段 public int age -->生成文件person.obj
    --2.序列化后:删除字段 public int age -->反序列化正常,age字段丢失
6.other-02:同包同类Person serialVersionUID使用默认或指定不变 --A端不含age,B端含age
    --1.序列化前:原字段 -->生成文件person.obj
    --2.序列化后:添加字段 public int age -->反序列化正常,age==0
7.静态成员变量序列化测试:pers.li.seri.staticvar.Test
    --序列化保存的是对象的状态,静态变量属于类的状态,因此 序列化并不保存静态变量
8.忽略序列化字段的方式:
    --1.transient关键字:例如:public transient int id; 
    --2.父类使用:将不需要被序列化的字段抽取出来放到父类中,子类实现 Serializable 接口,
                父类不实现,根据父类序列化规则,父类的字段数据将不被序列化,
9.父类序列化规则:
    --1.父类实现Serializable接口:可以正常序列化子类和父类
    --2.父类不实现Serializable接口:需要有默认无参构造函数,虚拟机是不会序列化父对象的,而一个 Java 对象的构造必须先有父对象,
        才有子对象,反序列化也不例外。 所以反序列化时,为了构造父对象,只能调用父类的无参构造函数作为默认的父对象。
        因此当我们取父对象的变量值时,它的值是调用父类无参构造函数后的值。如果你考虑到这种序列化的情况,
        在父类无参构造函数中对变量进行初始化,否则的话,父类变量值都是默认声明的值,如 int 型的默认是 0,string 型的默认是 null。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皇夜_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值