📅  最后修改于: 2023-12-03 14:42:20.355000             🧑  作者: Mango
Java 序列化是将 Java 对象转换为二进制格式,以便在网络上传输或将其保存在硬盘上。Java 序列化可以将对象转换为字节数组,也可以将其存储在文件中。
Java 序列化机制需要实现 Serializable 接口,该接口标记着一个类可以被序列化。如果一个类有一个属性需要被排除在序列化之外,可以将该属性标记为 transient。
下面是一个简单的示例代码:
import java.io.*;
public class SerializeDemo implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
private transient String password;
public SerializeDemo(String name, int age, String password) {
this.name = name;
this.age = age;
this.password = password;
}
public static void main(String[] args) {
SerializeDemo demo = new SerializeDemo("Tom", 20, "123456");
try {
FileOutputStream fileOut = new FileOutputStream("demo.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(demo);
out.close();
fileOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上述代码中,我们定义了一个类 SerializeDemo,实现了 Serializable 接口。该类有三个属性:name、age、password。其中 password 被标记为 transient,表示不将其序列化。
在 main 函数中,我们创建了一个 SerializeDemo 对象 demo,并使用 ObjectOutputStream 将其序列化并写入到文件 demo.ser 中。
反序列化是将二进制数据转换为 Java 对象的过程。反序列化器 ObjectInputStream 可以将一个对象从文件中读取,然后将其反序列化。
下面是一个简单的示例代码:
import java.io.*;
public class DeserializeDemo {
public static void main(String[] args) {
SerializeDemo demo = null;
try {
FileInputStream fileIn = new FileInputStream("demo.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
demo = (SerializeDemo) in.readObject();
in.close();
fileIn.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println("Name: " + demo.getName());
System.out.println("Age: " + demo.getAge());
System.out.println("Password: " + demo.getPassword());
}
}
在上述代码中,我们使用 ObjectInputStream 从文件 demo.ser 中读取序列化的对象,并将其转换为 SerializeDemo 类型。通过 getName、getAge 和 getPassword 方法,我们可以获取对象的属性。
Java 序列化机制可以方便地将对象序列化为可保存和传输的二进制格式。通过实现 Serializable 接口和 transient 关键字,可以控制序列化的行为。在反序列化时,需要注意类文件的版本兼容性问题。