Java序列化的作用以及方法?
- 什么叫序列化?
通俗点讲:它是处理对象流的一种机制,即可以很方便的保存内存中java对象的状态,同时也为了方便传输。
- 序列化版本号的用处:
- 在序列化存储/反序列化读取或者是序列化传输/反序列化接收时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。
- 在对实体类进行不影响业务流程的升级时,比如只追加了一个附加信息字段,可以不改变序列化版本号,来实现新旧实体类的兼容性(接收方的类里没有的字段被舍弃;多出来的字段赋初始值)。
-
序列化有什么作用?
1.方便传输,速度快,还很安全,被调用方序列化,调用方反序列化即可拿到传输前最原始的java对象,常用于不同进程之间的对象传输
2.方便存储,不管是存储成文件还是数据库都行,存储为文件,下回要用可以直接反序列拿到对象 -
序列化的几种方式
- 实现 Serializable 接口 ( 隐式序列化 )。通过实现 Serializable 接口,这种是隐式序列化 ( 不需要手动 ) ,这种是最简单的序列化方式,会自动序列化所有非 static 和 transient 关键字修饰的成员变量。因为序列化保存的是对象的状态,而
static修饰的字段属于类的状态,因此可以证明序列化并不保存static修饰的字段。 - 实现Externalizable接口。(显式序列化)。Externalizable 接口继承自 Serializable, 我们在实现该接口时,必须实现 writeExternal() 和readExternal() 方法,而且只能通过手动进行序列化,并且两个方法是自动调用的,因此,这个序列化过程是可控的,可以自己选择哪些部分序列化
- 实现Serializable接口+添加writeObject()和readObject()方法(显式+隐式序列化)
如果想将方式一和方式二的优点都用到的话,可以采用方式三, 先实现 Serializable 接口,并且添加writeObject() 和 readObject() 方法。注意这里是添加,不是重写或者覆盖。但是添加的这两个方法必须
有相应的格式。- 方法必须要被 private 修饰 —–> 才能被调用
- 第一行调用默认的 defaultRead/WriteObject() —–> 隐式序列化非 static 和 transient
- 调用 read/writeObject() 将获得的值赋给相应的值 —–> 显式序列化
- Json序列化
- 实现 Serializable 接口 ( 隐式序列化 )。通过实现 Serializable 接口,这种是隐式序列化 ( 不需要手动 ) ,这种是最简单的序列化方式,会自动序列化所有非 static 和 transient 关键字修饰的成员变量。因为序列化保存的是对象的状态,而
-
序列化注意点:
为了避免完全没有必要的报错麻烦,序列化的时候,最好是定义序列化版本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 其它测试用例
773

被折叠的 条评论
为什么被折叠?



