为什么要实现Serializable和Serializable的使用
综合网友资料和自己理解
工作中我们经常在进行持久化操作和返回数据时都会使用到javabean来统一封装参数,方便操作,一般我们也都会实现Serializable接口,那么问题来了,
Q1.为什么要进行序列化?
Q2. 每个实体bean都必须实现serializabel接口吗?
Q3.我做一些项目的时候,没有实现序列化,同样没什么影响,到底什么时候应该进行序列化操作呢?
首先第一个问题,实现序列化的两个原因:1、将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本;2、按值将对象从一个应用程序域发送至另一个应用程序域。实现serializabel接口的作用是就是可以把对象存到字节流,然后可以恢复,所以你想如果你的对象没实现序列化怎么才能进行持久化和网络传输呢,要==<对象状态的>持久化和网络传输==就得转为字节流,所以在分布式应用中及设计数据持久化的场景中,你就得实现序列化。
第二个问题,是不是每个实体bean都要实现序列化,答案其实还要回归到第一个问题,那就是你的bean是否需要持久化存储媒体中以及是否需要传输给另一个应用,没有的话就不需要,例如我们利用fastjson将实体类转化成json字符串时,并不涉及到转化为字节流,所以其实跟序列化没有关系。
第三个问题,序列化的对象包括基本数据类型,所有集合类以及其他许多东西,还有Class 对象。有的时候并没有实现序列化,依然可以持久化到数据库。这个其实我们可以看看实体类中常用的数据类型,例如Date、String等等,它们已经实现了序列化,而一些基本类型,数据库里面有与之对应的数据结构,从我们的类声明来看,我们没有实现serializabel接口,其实是在声明的各个不同变量的时候,由具体的数据类型帮助我们实现了序列化操作。下面是一段String实现Serializable接口的源码截图
另外需要注意的是,在NoSql数据库中,并没有与我们java基本类型对应的数据结构,所以在往nosql数据库中存储时,我们就必须将对象进行序列化,同时在网络传输中我们要注意到两个应用中javabean的serialVersionUID要保持一致,不然就不能正常的进行反序列化。
4 补充一点
细致的朋友可能会发现一个问题,Serializable接口(还有Cloneable)里面什么方法都没有,这样的接口有什么用呢?其实就是一个标志罢了,结合instanceof关键字判断某一个类或接口是否属于这个标志
没有方法的接口<接口标志>:https://blog.****.net/qq_39209361/article/details/80800663
花几分钟看个代码案例敲一遍就都明白了(Serializable和Externalizable的使用):
https://www.cnblogs.com/huhx/p/serializable.html