Java序列化的作用以及方法?

Java序列化的作用以及方法?

  • 什么叫序列化?

通俗点讲:它是处理对象流的一种机制,即可以很方便的保存内存中java对象的状态,同时也为了方便传输。

  • 序列化版本号的用处:
  1. 在序列化存储/反序列化读取或者是序列化传输/反序列化接收时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。
  2. 在对实体类进行不影响业务流程的升级时,比如只追加了一个附加信息字段,可以不改变序列化版本号,来实现新旧实体类的兼容性(接收方的类里没有的字段被舍弃;多出来的字段赋初始值)。
  • 序列化有什么作用?
    1.方便传输,速度快,还很安全,被调用方序列化,调用方反序列化即可拿到传输前最原始的java对象,常用于不同进程之间的对象传输
    2.方便存储,不管是存储成文件还是数据库都行,存储为文件,下回要用可以直接反序列拿到对象

  • 序列化的几种方式

    • 实现 Serializable 接口 ( 隐式序列化 )。通过实现 Serializable 接口,这种是隐式序列化 ( 不需要手动 ) ,这种是最简单的序列化方式,会自动序列化所有非 static 和 transient 关键字修饰的成员变量。因为序列化保存的是对象的状态,而 static 修饰的字段属于类的状态,因此可以证明序列化并不保存 static 修饰的字段。
    • 实现Externalizable接口。(显式序列化)。Externalizable 接口继承自 Serializable, 我们在实现该接口时,必须实现 writeExternal() 和readExternal() 方法,而且只能通过手动进行序列化,并且两个方法是自动调用的,因此,这个序列化过程是可控的,可以自己选择哪些部分序列化
    • 实现Serializable接口+添加writeObject()和readObject()方法(显式+隐式序列化)
      如果想将方式一和方式二的优点都用到的话,可以采用方式三, 先实现 Serializable 接口,并且添加writeObject() 和 readObject() 方法。注意这里是添加,不是重写或者覆盖。但是添加的这两个方法必须
      有相应的格式。
      1. 方法必须要被 private 修饰 —–> 才能被调用
      2. 第一行调用默认的 defaultRead/WriteObject() —–> 隐式序列化非 static 和 transient
      3. 调用 read/writeObject() 将获得的值赋给相应的值 —–> 显式序列化
    • Json序列化
  • 序列化注意点:
    为了避免完全没有必要的报错麻烦,序列化的时候,最好是定义序列化版本id,也就是public static final Long seriaVersionUID = 1L (默认)或者是 xxxxx L(自定义64位都可以)。
    由于,反序列化会判断序列化中的id和类中的id是不是一致,假如不定义,虽然会自动生成,但是,假如后面改了字段列,就会出现不一致的情况,所以说,还是自觉点定义一个id要好一些,可以省去非常多的麻烦。
    与此同时要记住了,静态变量不会被序列化,它不在堆内存,序列化只会序列化堆内存。
    参考博客连接:https://blog.csdn.net/qq_35936973/article/details/115700778

  • serialVersionUID的生成过程如下:

0.序列化和反序列化的核心是理解serialVersionUID的作用。

1.他是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段。
(很重要,是serialVersionUID的生成算法元素)

2.序列化生成的serialVersionUID要和反序列化的serialVersionUID要一致才可以认为是同一序列版本。

3.serialVersionUID可以手动指定,如果不指定则JAVA虚拟机自动根据类名、接口名、成员方法及属性等来生成。

4.相当于生成serialVersionUID的算法的元素是类名、接口名、成员方法及属性等如果有一样修改了,那么JVM虚拟机自动生成的serialVersionUID就会不一样。

5.建议自己写一个demo测试serialVersionUID的作用加深理解,其中测试用例可以包含:
 *0 类的路径不一致,其它一样 ;
 *1 类名不一样其它一样; 
 *2 类中的属性、成员变量、成员方法依次不一样,其它一样; 
 *3 修改serialVersionUID的值,一样时和不一样时的结果
 *4 其它测试用例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

西瓜程序设计

您的打赏将是我创作的最大动力!

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

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

打赏作者

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

抵扣说明:

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

余额充值