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
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》