
Serializable接口定义
Serializable是 java.io 包中定义的用于实现 Java 类的序列化和反序列化操作而提供的一个语义级别的接口。
Serializable接口作用
实现Serilizable接口是为了序列化,序列化就是把数据结构或对象转换成二进制串。
比如:Java序列化就指把Java对象转换为二进制字节流的过程,如下图所示:

反序列化就是把二进制串还原成对象格式,比如:Java反序列化是指把二进制字节流,恢复为Java对象的过程。

之所以需要序列化和反序列化,主要是因为Java对象是在JVM中生成的,是内存中的数据。
如果需要把对象的字节序列远程传输或保存到硬盘上时,你就需要将Java对象转换成二进制流,这个转换过程就是Java序列化。
Serializable接口实例
下面我们可以通过例子来实现将序列化的对象存储到文件,然后再将其从文件中反序列化为对象。
1.创建一个User对象,并实现Serializable接口。
如下所示:
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
}
2.将User对象信息写入到磁盘当中。
public class serializeTest {
public static void main(String[] args) throws Exception {
User user = new User();
user.setName("mikechen");
serialize(user);
log.info("Java序列化前的结果:{} ", user);
User duser = deserialize();
log.info("Java反序列化的结果:{} ", duser);
}
private static void serialize(User user) throws Exception {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("C:\\mikechen.txt")));
oos.writeObject(user);
oos.close();
}
private static User deserialize() throws Exception {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("C:\\mikechen.txt")));
return (User) ois.readObject();
}
}
结果如下:
序列化前的结果: User(name=mikechen) 反序列化后的结果: User(name=mikechen)
我们看到对象数据以二进制文本的方式被持久化到了磁盘文件中。
在进行反序列化测试之前,我们可以尝试下将User实现Serializable接口的代码部分去掉,看看此时写操作是否还能成功,结果如下:
java.io.NotSerializableException: cn.mikechen.serializable.User
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1288)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:688)
at cn.wudimanong.serializable.SerializableTest.writeObj(SerializableTest.java:18)
at cn.wudimanong.serializable.SerializableTest.main(SerializableTest.java:28)
抛出了NotSerializableException异常,提示非可序列化异常,也就是说没有实现Serializable接口的对象是无法通过IO操作持久化的。
关于mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。