千家信息网

Java中Serializable接口的作用是什么

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,Java中Serializable接口的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先我们先看看Seria
千家信息网最后更新 2026年10月31日Java中Serializable接口的作用是什么

Java中Serializable接口的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

首先我们先看看Serializable接口里面有什么。这个接口啥也没有,那么是如何做到将Java对象转换为字节数组的呢?

public interface Serializable {}

我们来实践一下,看看Serializable是如何序列化Java对象的.创建一个类SClass(序列化类),增加name和age两个属性,并创建Getter和Setter方法。

public class SClass {    private String name;    private Integer age;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }}

再创建一个测试类,通过ObjectOutputStream将一个SClass对象写入文件中,这个实际上就是一种序列化的过程;再通过ObjectInputSream将SClass对象读取出来,这个实际上就是一个返序列化的过程。

public class Test {    public static void main(String[] args) {        // 初始化        SClass sclass = new SClass();        sclass.setName("王二");        sclass.setAge(18);        System.out.println(sclass);        // 把对象写到文件中        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("file"));){            oos.writeObject(sclass);        } catch (IOException e) {            e.printStackTrace();        }        // 从文件中读出对象        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("file")));){            SClass sclass1 = (SClass) ois.readObject();            System.out.println(sclass1);        } catch (IOException | ClassNotFoundException e) {            e.printStackTrace();        }    }}

由于SClass没有实现Serializable接口,所以系统会报错。

顺着堆栈信息,我们来看一下 ObjectOutputStream 的 writeObject0() 方法。其部分源码如下:

if (obj instanceof String) {    writeString((String) obj, unshared);} else if (cl.isArray()) {    writeArray(obj, desc, unshared);} else if (obj instanceof Enum) {    writeEnum((Enum) obj, desc, unshared);} else if (obj instanceof Serializable) {    writeOrdinaryObject(obj, desc, unshared);} else {    if (extendedDebugInfo) {        throw new NotSerializableException(            cl.getName() + "\n" + debugInfoStack.toString());    } else {        throw new NotSerializableException(cl.getName());    }}

这段代码的意思是,ObjectOutPutStream在序列化的时候,会判断对象的类型,如果不是字符串、数组、枚举、Serializable的湖锕,会抛出NotSerializableException。

但是,如果SClass实现了Serializable接口的话,就可以被序列化和反序列化了。

具体是怎么序列化的呢?

以ObjectOutputStream为例,它在序列化的时候会依次调用writeObject()→writeObject0()→writeOrdinaryObject()→writeSerialData()→invokeWriteObject()→defaultWriteFields()。

defaultWriteFields方法为真正将对象序列化的接口。

那怎么反序列化呢?

以 ObjectInputStream 为例,它在反序列化的时候会依次调用 readObject()→readObject0()→readOrdinaryObject()→readSerialData()→defaultReadFields()。

defaultReadFields方法为真正将对象反序列化的接口。

所以Serializable接口仅仅是起到了标识的作用,告诉程序,他可以被序列化。

其他知识点:

1. static 和 transient 修饰的字段是不会被序列化的。

因为序列化保存的是对象的状态,而 static 修饰的字段属于类的状态,因此可以证明序列化并不保存 static 修饰的字段。

transient 的中文字义为"临时的"(论英语的重要性),它可以阻止字段被序列化到文件中,在被反序列化后,transient 字段的值被设为初始值,比如 int 型的初始值为 0,对象型的初始值为 null。

2. 除了 Serializable 之外,Java 还提供了一个序列化接口 Externalizable(念起来有点拗口)。

3. serialVersionUID 被称为序列化 ID,它是决定 Java 对象能否反序列化成功的重要因子。在反序列化时,Java 虚拟机会把字节流中的 serialVersionUID 与被序列化类中的 serialVersionUID 进行比较,如果相同则可以进行反序列化,否则就会抛出序列化版本不一致的异常。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

序列 对象 接口 字段 文件 方法 时候 作用 重要 实际 实际上 就是 数组 状态 知识 过程 帮助 拗口 清楚 相同 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海挚品互联网科技有限公司 亿人帮互联网科技有限公司 西安纸贵互联网科技有限公司 杭州互联网科技公司 互联网科技排名 致聘互联网科技 互联网科技ppt模板 科技互联网公司logo 互联网科技公司有哪些 金融科技与互联网金融相同和不同 受益于互联网科技的高速发展 宝灵互联网科技有限公司 国大互联网教育科技有限公司工作 江苏苏星互联网科技有限公司 东营紫格互联网科技 互联网领先科技活动 科技和互联网行业的特点 科技互联网公司两年变化 北京瑞云互联网科技有限公司 知域互联网科技有限公司官网 北京互联网科技有限公司 互联网科技公司需要的职位 顶级互联网科技成果有哪些 重庆互联网医院沙龙医盟信息科技 宜昌元轩互联网科技有限公司 科技类公司包括互联网吗 广州新华互联网科技学校电竞方面 合肥互联网科技公司公章图片 好易买互联网科技 互联网大会出现的黑科技
0