Java 序列化是一种将对象转换为字节流的机制,可以将对象的状态保存到文件或通过网络进行传输。序列化主要用于对象的持久化和数据传输。

序列化基础:

Java 序列化是通过 java.io.Serializable 接口来实现的。如果一个类希望被序列化,需要实现 Serializable 接口。该接口是一个标记接口,不包含任何方法,只是表明该类可以被序列化。
import java.io.Serializable;

public class MyClass implements Serializable {
    // 类的成员和方法
}

对象序列化:

使用 ObjectOutputStream 类可以将对象序列化为字节流,以便存储到文件或发送到网络。
import java.io.*;

public class SerializationExample {
    public static void main(String[] args) {
        // 创建一个对象
        MyClass myObject = new MyClass();

        // 序列化对象到文件
        try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("object.ser"))) {
            outputStream.writeObject(myObject);
            System.out.println("Object serialized successfully.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

对象反序列化:

使用 ObjectInputStream 类可以从字节流中反序列化对象。
import java.io.*;

public class DeserializationExample {
    public static void main(String[] args) {
        // 反序列化对象
        try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("object.ser"))) {
            MyClass myObject = (MyClass) inputStream.readObject();
            System.out.println("Object deserialized successfully.");
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

序列化版本号:

在序列化时,每个类都有一个版本号。如果在序列化之后对类进行了修改,Java 将使用版本号来验证是否可以正确反序列化。可以通过显式声明一个 serialVersionUID 字段来控制版本号,避免默认计算。
private static final long serialVersionUID = 1L;

避免序列化某些字段:

可以使用 transient 关键字标记某个字段,从而在序列化过程中排除该字段。
private transient String sensitiveInformation;

自定义序列化:

可以在类中定义 writeObject 和 readObject 方法来自定义序列化和反序列化的过程。
private void writeObject(ObjectOutputStream out) throws IOException {
    // 自定义写操作
    out.defaultWriteObject();
    out.writeObject(sensitiveInformation.toUpperCase());
}

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
    // 自定义读操作
    in.defaultReadObject();
    sensitiveInformation = ((String) in.readObject()).toLowerCase();
}

以上是 Java 序列化的基本概念和用法。需要注意的是,序列化和反序列化过程中类的结构需要保持一致。如果类发生了变化,可能导致反序列化失败。因此,在对类进行修改时,要注意版本号的管理和处理。


转载请注明出处:http://www.zyzy.cn/article/detail/435/Java