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

Java序列化详解(小白也能学会的对象持久化技术)

在Java开发中,Java序列化是一个非常重要的概念。它允许我们将内存中的Java对象转换为字节流,以便存储到文件、数据库或通过网络传输。这个过程也被称为对象序列化。本文将从零开始,手把手教你如何使用Java实现对象的序列化与反序列化。

什么是Java序列化?

简单来说,Java序列化就是把一个Java对象变成一串字节(byte stream),而反序列化则是把这个字节流还原成原来的对象。这项技术常用于:

  • 保存对象状态到本地文件
  • 在网络上传输对象(如RMI、Socket通信)
  • 缓存对象数据
Java序列化详解(小白也能学会的对象持久化技术) Java序列化 对象序列化 Serializable接口 Java IO流 第1张

实现序列化的关键:Serializable接口

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

示例:定义一个可序列化的Person类

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;    }        // Getter 和 Setter 方法    public String getName() {        return name;    }        public void setName(String name) {        this.name = name;    }        public int getAge() {        return age;    }        public void setAge(int age) {        this.age = age;    }        @Override    public String toString() {        return "Person{name='" + name + "', age=" + age + "}";    }}

注意:serialVersionUID 是一个版本控制ID。建议显式声明它,以避免因类结构变化导致反序列化失败。

序列化与反序列化操作

接下来,我们使用 ObjectOutputStream 进行序列化,用 ObjectInputStream 进行反序列化。这两个类属于 Java IO流体系。

序列化示例代码

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();        }    }}

反序列化示例代码

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,则其字段不会被序列化(除非子类手动处理)。
  • 序列化不适用于静态变量,因为它们属于类而非对象。
  • 确保所有被序列化的对象及其引用的对象都实现了 Serializable 接口。

总结

通过本教程,你已经掌握了 Java序列化 的基本原理和实现方法。记住,核心是让类实现 Serializable 接口,并使用 Java IO流 中的 ObjectOutputStreamObjectInputStream 来完成序列化与反序列化操作。这项技术在分布式系统、缓存机制和持久化存储中非常实用。

希望这篇关于 对象序列化 的入门教程能帮助你轻松上手!如有疑问,欢迎在评论区交流。