【Java SE】Serializable 序列化

可以参考:
https://blog.csdn.net/X8i0Bev/article/details/90168188

Serializable接口是一个里面什么都没有的接口
它的源代码是public interface Serializable{},即什么都没有。

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

提问:什么是Serializable接口?
一个对象序列化的接口,一个类只有实现了Serializable接口,它的对象才能被序列化。

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

提问:为什么要序列化对象?
把对象转换为字节序列的过程称为对象的序列化;
把字节序列恢复为对象的过程称为对象的反序列化;

提问:什么情况下需要序列化?

1.当你想把内存中的对象写入到硬盘时;
2.当你想用套接字在网络上传输对象时;
3.当你想通过RMI调用对象时(RMI总结来说就是远程调用对象,在一个jvm上调用另一个jvm的对象);

当我们需要把对象的状态信息通过网络进行传输,或者需要将对象的状态信息持久化,以便将来使用时都需要把对象进行序列化;
那为什么还要继承Serializable。那是存储对象在存储介质中,以便在下次使用的时候,可以很快捷的重建一个副本。
或许你会问,我在开发过程中,实体并没有实现序列化,但我同样可以将数据保存到mysql、Oracle数据库中,为什么非要序列化才能存储呢?
一个接口里面什么内容都没有,我们可以将它理解成一个标识接口。

比如在课堂上有位学生遇到一个问题,于是举手向老师请教,这时老师帮他解答;
那么这位学生的举手其实就是一个标识,自己解决不了问题请教老师帮忙解决。
在Java中的这个Serializable接口其实是给JVM看的,通知JVM,我不对这个类做序列化了,你:JVM帮我序列化就好了。

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

什么情况下会用到序列化?

  • 提问:一个类implements Serializable后,为什么代码中需要声明64位的serialVersionUID

比如实体类中有一句:
private static final long serialVersionUID = 3450342483181838030L;

Java 类进行序列化也两个主要目的,分别为:

1.把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2.在网络上传送对象的字节序列。

而某个Java类 implements Serializable后,需要添加参数serialVersionUID的语句;
serialVersionUID是一个非常重要的字段,因 Java 的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。
在进行反序列化时,JVM 会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。

一般来说,定义serialVersionUID的方式有两种,分别为:

1.采用默认的1L,具体为private static final long serialVersionUID = 1L;
2.根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,例如private static final long serialVersionUID = XXXL;

这里讲的是如何让IDE生成64位的Long哈希字段;

详细部署随机生成步骤:
https://blog.csdn.net/weixin_42915286/article/details/83069223
搜索serialVersionUID

步骤1:安装插件GenerateSerialVersionUID
步骤二:Inspections - Serializable class without 'serialVersionUID',设置为Warining
步骤三:实体类名中一旦implements了Serializable,类名就会报错,提示自动生成serialVersionUID
步骤四:随机生成serialVersionUID

你可能感兴趣的:(Java,SE)