java序列化和反序列化为什么要实现Serializable接口?
1. 序列化和反序列化
- 序列化:把对象转换为字节序列的过程称为对象的序列化。
- 反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
说简单点:序列化就是讲对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,他将流转换为对象,这两个过程结合起来,可以很轻松的存储和传输数据。

2. 什么时候用到序列化和反序列化
如果我们只在本地jvm里运行java实例,这个时候不会用到序列化和反序列化。只有当我们需要将内存中的对象持久化到磁盘、数据库中时,需要与浏览器进行交互、需要实现RPC时,这个时候就需要序列化和反序列化了。
只要我们对内存中的对象进行持久化和网络传输,这个时候都需要序列化和反序列化
服务器与浏览器进行交互时使用到序列化的:JSON格式实际上就是将一个对象转换为字符串,所以服务器与浏览器交互时的数据格式其实本质就是字符串。我们再来看看String源码,实现了Serializable接口,并且指定了serialVersionUID的值。

同样的持久化到数据库时,mybatis数据库映射文件里的代码
<inserrt id="createAll" parameterType="com.geng.User">
insert into user values(default,#{name},#{password})
</insert>
我们入库并不是把整个对象持久化到数据库,而是将对象的属性持久化到数据库中,然而同时这些属性都是实现了Serializable接口的基本属性。
3. 实现序列化和反序列化为什么要实现Serializable接口
在java中实现了Serializable接口后,jvm会在底层帮我们实现序列化和反序列化,如果我们不实现Serializable接口,就需要自己去写一套序列化和反序列化代码,这样也可以。
4.什么是Serializable接口
它是java里一个对象序列化的接口,一个类只有实现了Serializable接口,他的对象才能被序列化。

可以看到Serializable是一个空接口,一个接口里面什么内容都没有,我们可以将它理解成一个标识接口。jvm根据这个标识去进行序列化和反序列化的操作。
5. 实现Serializable接口后,为什么需要指定serialVersionUID的值
如果不显示指定serialVersionUID, JVM在序列化时会根据属性自动生成一个serialVersionUID, 然后与属性一起序列化, 再进行持久化或网络传输. 在反序列化时, JVM会再根据属性自动生成一个新版serialVersionUID, 然后将这个新版serialVersionUID与序列化时生成的旧版serialVersionUID进行比较, 如果相同则反序列化成功, 否则报错.
6. java序列化的其他特性
被 @transient 注解修饰的属性不会被序列化(或者是transient),static属性也不会被序列化
private transient String name;
private static String age;
@transient 注解的形式需要放到set和get方法上
序列化是针对对象而言的,而static属性优先于对象存在,随着类的加载而加载,所以不会被序列化。
serialVersionUID也被static修饰,为什么serialVersionUID会被序列化,其实serialVersionUID属性并没有被序列化,jvm在序列化对象时会自动生成一个serialVersionUID,然后将我们现实指定的serialVersionUID属性值赋给自动生成的serialVersionUID
7. jvm了解一下
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的
浙公网安备 33010602011771号