当前位置:首页 > Java > 正文

深入理解Java序列化(小白也能轻松掌握的对象持久化技术)

在Java开发中,我们经常需要将对象保存到文件、数据库,或者通过网络传输。这时候,Java序列化就派上用场了。本教程将带你从零开始,一步步掌握对象序列化的核心概念和实现方法。

深入理解Java序列化(小白也能轻松掌握的对象持久化技术) Java序列化 对象序列化 Serializable接口 Java IO流 第1张

什么是Java序列化?

Java序列化是指将Java对象转换为字节流(byte stream)的过程,以便可以将其保存到文件、数据库,或通过网络发送。反序列化则是将字节流还原为原始对象的过程。

这个功能在分布式系统、缓存机制、持久化存储等场景中非常常见。

实现序列化的前提:Serializable接口

要让一个Java类支持序列化,只需让它实现 java.io.Serializable 接口即可。这是一个标记接口(marker interface),它没有任何方法,只是告诉JVM:“这个类的对象可以被序列化”。

下面是一个简单的可序列化类示例:

import java.io.Serializable;public class Person implements Serializable {    private static final long serialVersionUID = 1L; // 推荐显式声明        private String name;    private int age;        public Person(String name, int age) {        this.name = name;        this.age = age;    }        @Override    public String toString() {        return "Person{name='" + name + "', age=" + age + "}";    }        // getter 和 setter 方法(省略)}

注意:serialVersionUID 是用于版本控制的。如果类结构发生变化(如添加字段),但 serialVersionUID 不匹配,反序列化会失败。因此建议显式声明它。

如何序列化和反序列化对象?

Java提供了 ObjectOutputStreamObjectInputStream 来完成序列化与反序列化操作。它们属于 Java IO流 体系的一部分。

1. 序列化对象(写入文件)

import java.io.FileOutputStream;import java.io.ObjectOutputStream;public class SerializeExample {    public static void main(String[] args) {        Person person = new Person("张三", 25);                try (FileOutputStream fileOut = new FileOutputStream("person.ser");             ObjectOutputStream out = new ObjectOutputStream(fileOut)) {                        out.writeObject(person); // 序列化对象            System.out.println("对象已成功序列化并保存到 person.ser");                    } catch (Exception e) {            e.printStackTrace();        }    }}

2. 反序列化对象(从文件读取)

import java.io.FileInputStream;import java.io.ObjectInputStream;public class DeserializeExample {    public static void main(String[] args) {        Person person = null;                try (FileInputStream fileIn = new FileInputStream("person.ser");             ObjectInputStream in = new ObjectInputStream(fileIn)) {                        person = (Person) in.readObject(); // 反序列化对象            System.out.println("反序列化成功:" + person);                    } catch (Exception e) {            e.printStackTrace();        }    }}

注意事项与常见问题

  • 不是所有字段都会被序列化。用 transient 修饰的字段会被跳过。
  • 父类如果未实现 Serializable,其字段不会被序列化(除非子类处理)。
  • 静态(static)字段不属于对象状态,不会被序列化。
  • 确保反序列化时类路径中存在对应的类定义,否则会抛出 ClassNotFoundException

总结

通过本教程,你已经掌握了 Java序列化 的基本原理和使用方法。记住关键点:实现 Serializable 接口、使用 ObjectOutputStreamObjectInputStream、注意 serialVersionUIDtransient 字段。这些知识是构建健壮Java应用的基础,尤其在涉及 Java IO流 和数据持久化的场景中。

现在,你可以尝试自己编写一个可序列化的类,并完成保存和读取操作。实践是最好的老师!