在Java中操作数据库经常会遇到Serializable,那么它具体是什么呢?

我们将从以下四个方面介绍:

1、什么是Serializable?

Serializable是Java提供的通用数据保存、读取和传输的接口,
其源码极为简洁,就是一个接口的声明。
在这里插入图片描述

2、Serializable作用

通过实现Serializable接口的类,该类所实例化的对象(实例变量)的状态信息在内存中可以持久化保存、传输,该过程称为序列化。

在这里插入图片描述
与之相反的是,将序列化的结果变成对象的过程称为反序列化。
在这里插入图片描述

3、Serializable应用场景

当我们需要把对象的状态信息:

A 通过网络进行传输(用套接字在网络上传送)
B 需要将对象的状态信息持久化(写入硬盘)

以便将来使用时都需要把对象进行序列化

4、Serializable使用过程

A 创建一个类,并实现Serializable接口
在这里插入图片描述
B 写入到文件中

C 进行读操作

5、Serializable的注意事项

a)序列化时,只对对象的状态进行保存,而不管对象的方法;
b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
d) serialVersionUID是用来辅助对象的序列化与反序列化的,原则上序列化后的数据当中的serialVersionUID与当前类当中的serialVersionUID一致,那么该对象才能被反序列化成功。这个serialVersionUID的详细的工作机制是:在序列化的时候系统将serialVersionUID写入到序列化的文件中去,当反序列化的时候系统会先去检测文件中的serialVersionUID是否跟当前的文件的serialVersionUID是否一致,如果一直则反序列化成功,否则就说明当前类跟序列化后的类发生了变化,比如是成员变量的数量或者是类型发生了变化,那么在反序列化时就会发生crash,并且回报出错误
e)并非所有的对象都可以序列化,,至于为什么不可以,有很多原因了,比如:
1.安全方面的原因,比如一个对象拥有private,public等field,对于一个要传输的对象,比如写到文件,或者进行rmi传输 等等,在序列化进行传输的过程中,这个对象的private等域是不受保护的。
2. 资源分配方面的原因,比如socket,thread类,如果可以序列化,进行传输或者保存,也无法对他们进行重新的资源分 配,而且,也是没有必要这样实现。

看这篇文章有感:Serializable原文地址

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐