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是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的

 

posted @ 2020-08-19 11:37  Be_Ready_For_Battle  阅读(268)  评论(0)    收藏  举报