Serializable接口详解(定义作用及用法实例)

Serializable接口详解(定义作用及用法实例)-mikechen

Serializable接口定义

Serializable是 java.io 包中定义的用于实现 Java 类的序列化和反序列化操作而提供的一个语义级别的接口。

 

Serializable接口作用

实现Serilizable接口是为了序列化,序列化就是把数据结构或对象转换成二进制串。

比如:Java序列化就指把Java对象转换为二进制字节流的过程,如下图所示:

Serializable接口详解(定义作用及用法实例)-mikechen

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

Serializable接口详解(定义作用及用法实例)-mikechen

之所以需要序列化和反序列化,主要是因为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面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法