登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  java教程

对象序列化

时间:2026-08-21 05:10:30 294浏览 收藏

程序在运行过程中,可能需要将一些数据永久的保存到磁盘上,而数据在Ja va中都是保存在对象当中的。那么我们要怎样将对象中的数据保存到磁盘上呢?这时就需要使用Ja va中的对象序列化。

对象序列化

对象的序列化(Serializable)是指将一个Ja va对象转换成一个I/O流中字节序列的过程。其目的是为了将对象保存到磁盘中,或允许在网络中直接传输对象。对象序列化机制可以使内存中的Ja va对象转换成与平台无关的二进制流,既可以将这种二进制流持久地保存在磁盘上,又可以通过网络将这种二进制流传输到另一个网络节点,其他程序在获得了这种二进制流后,还可以将它恢复成原来的Ja va对象。这种将I/O流中的字节序列恢复为Ja va对象的过程被称之为反序列化(Deserialize)。

如果想让某个对象支持序列化机制,那么这个对象所在的类必须是可序列化的。在Ja va中,可序列化的类必须实现Serializable或Externalizable两个接口之一。这两个接口实现序列化机制的主要区别如表1所示。

表1 实现Serializable与实现Externalizable的对比

实现Serializable**接口** 实现Externalizable**接口**
系统自动存储必要的信息 由程序员决定所存储的信息
Ja va内部支持,易于实现,只需实现该接口即可,不需要其他代码支持 接口中只提供了两个空方法,实现该接口必须为两个空方法提供实现
性能较差 性能较好

与实现Serializable接口相比,虽然实现Externalizable接口可以带来一定性能上的提升,但也将导致编程的复杂度增加。在实际开发时,大部分都是采用实现Serializable接口的方式来实现序列化的。

使用Serializable接口实现序列化非常简单,只需要让目标类实现Serializable接口即可,无需实现任何方法。例如让Person类实现序列化接口的代码如下:

public class Person implements Serializable{
    // 为该类指定一个serialVersionUID变量值
    private static final long serialVersionUID = 1L;
    //声明变量
    private int id;
    private String name;
    private int age;
    // 此处省略各属性的getter和setter方法
    ...
}

从这段代码来看,Person 类实现了 Serializable 接口,同时还显式指定了一个 serialVersionUID 变量。这个变量的作用,说白了就是用来标识 Ja va 类的序列化版本。要是没有手动定义 serialVersionUID,那么 JVM 就会根据这个类的相关信息,自动计算并生成一个对应的 serialVersionUID 值。

小提示:

serialVersionUID是Ja va序列化机制里的一个关键标识。说得直白一点,Ja va在处理序列化和反序列化时,会先看这个值是不是对得上,用它来判断类的版本是否一致。反序列化发生时,JVM会把字节流里携带的serialVersionUID,和本地对应实体类中的serialVersionUID做一次比对;一致,说明版本匹配,可以顺利完成反序列化;不一致,就会抛出序列化版本不兼容的异常。也正因为如此,凡是需要序列化的类,通常都建议显式声明一个private static final long serialVersionUID,具体取值可以自己定义(默认常写为1L,当然系统也能基于类名、接口名、成员方法、属性等信息生成一个64位哈希值)。这样做的好处在于:对象一旦完成序列化,即便后续它对应的类发生了修改,这个对象通常也仍然能够被正确反序列化。

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>