Serializable是什么

一般情况下,我们在定义实体类时会继承Serializable接口,类似这样:

public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    private Integer id;

  ......
    }
  • 什么是Serializable接口

    一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化。

  • 什么是序列化?

    序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

对象转换为字节序列的过程称为对象的序列化;
字节序列恢复为对象的过程称为对象的反序列化

  • 什么情况下需要序列化?

当我们需要把对象的状态信息通过网络进行传输,或者需要将对象的状态信息持久化,以便将来使用时都需要把对象进行序列化

那为什么还要继承Serializable。那是存储对象在存储介质中,以便在下次使用的时候,可以很快捷的重建一个副本。

或许你会问,我在开发过程中,实体并没有实现序列化,但我同样可以将数据保存到mysql、Oracle数据库中,为什么非要序列化才能存储呢?

我们来看看Serializable到底是什么,跟进去看一下,我们发现Serializable接口里面竟然什么都没有,只是个空接口

一个接口里面什么内容都没有,我们可以将它理解成一个标识接口

比如,一个学生遇到一个问题,此时,她举手了(示意我去帮他解决),然后我过去,帮他解决了,那么这个举手其实就是一个标识,自己不能解决的问题标示我去帮他解决,在Java中的这个Serializable接口是给JVM看的,告诉JVM,我不做这个类的序列化了,你(JVM)给我序列化,序列化就是变成二进制流,比如云计算、Hadoop,特别是Hadoop完全就是分布式环境,那么就要涉及到对象要在网络中传输,里面的全是二进制流,当然你来做这个序列化操作也可以,但是这个类里面可能还有一个类,如果你把外面的类对象Person变成二进制,那么里面也要序列化(这要用到深度遍历,很麻烦),干脆告诉JVM,让他来帮你做。

Serializable接口就是Java提供用来进行高效率的异地共享实例对象的机制,实现这个接口即可。

为什么要定义serialversionUID变量

如果我们没有自己声明一个serialVersionUID变量,接口会默认生成一个serialVersionUID,强烈建议用户自定义一个serialVersionUID,因为默认的serialVersinUID对于class的细节非常敏感,反序列化时可能会导致InvalidClassException这个异常。

https://baijiahao.baidu.com/s?id=1633305649182361563&wfr=spider&for=pc

猜你喜欢

转载自blog.csdn.net/Airuiliya520/article/details/107648047