对程序员来讲,Serializable 接口 一直隐藏在我们的代码中,但序列化操作已经封装在我们所使用的框架中,所以序列化已经无需我们亲自实现Serializable接口。但是每次深入了解别人的代码或现使用的框架,对他们使用了Serializable总是特别迷惑。下面我将已程序媛的角度对Serializable接口进行讲解:
1.对序列化做简单的定义。 Serializable接口 在jdk中 定义为 java.io.Serializable,此接口没有方法、没有属性,仅仅用于标识可序列化。简单来说就是将对象示例保存到文件、数据库,进行传输。需要用时读磁盘或数据库将数据还原。
2.我们平时在什么场景下用到了序列化。其实我们平时就有用到很多序列化,只是我们不知道它就是序列化而已。目前我所了解到的序列化方式有:二进制、xml、json。其中二进制传输比如图片、peson实例等,通过outputStream、inputStream进行写入和读入。
3. 关于private static final long serialVersionUID = 7835683779754L。大家对这语句已经太熟悉了。首先讲讲jdk中序列化的原理。比如下面:
旧对象 :public class Person implements Serializable (){ private String name;} 新对象:public class Person implements Serializable(){ private String name1;}. 改变了里面的属性名。当对象实现 Serializable时,对象已经默认产生了一个serialVersionUID。当你改变属性名时,系统又会重新生成一个serialVersionUID。所以当旧对象要反序列为新对象时,因为SUID不同就会出现报错:java.io.InvalidClassException:Employee; local class incompatible。很多时候为了避免因为新对象属性的增加,我们常常自定义一个serialVersionUID。兼容旧对象的读取,改变或新增的属性名默认为fasle、0、null。
4.总结。很多时候我们进行的数据传输、保存文件都是使用或间接使用了序列化的接口。