在Java中实现序列化和反序列化主要有两种方式:使用ObjectOutputStream和ObjectInputStream流类,或使用Java序列化API。
序列化是将对象的状态信息转换为字节流的过程,以便将其存储在文件或数据库中,或通过网络连接发送到其他机器上。反序列化则是将字节流恢复为对象状态信息的过程。
下面是一个简单的示例代码,演示如何使用ObjectOutputStream和ObjectInputStream对对象进行序列化和反序列化:
import java.io.*;
class Person implements Serializable {
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 +
'}';
}
}
public class SerializationExample {
public static void main(String[] args) {
Person person = new Person("Alice", 30);
// 序列化
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
oos.writeObject(person);
System.out.println("Serialized object is saved in person.ser");
} catch (IOException e) {
e.printStackTrace();
}
// 反序列化
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person deserializedPerson = (Person) ois.readObject();
System.out.println("Deserialized object is: " + deserializedPerson);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
在上面的示例中,我们定义了一个Person类,该类实现了Serializable接口。然后,我们创建了一个Person对象,并使用ObjectOutputStream将其序列化到文件person.ser中。接下来,我们使用ObjectInputStream从文件person.ser中反序列化Person对象。
Java序列化API提供了一组接口和类,用于序列化和反序列化Java对象。使用Java序列化API实现序列化和反序列化的步骤与使用ObjectOutputStream和ObjectInputStream类似,但需要更多地使用接口和类。
下面是一个简单的示例代码,演示如何使用Java序列化API对对象进行序列化和反序列化:
import java.io.*;
import java.io.Serializable;
class Person implements Serializable {
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 +
'}';
}
}
public class JavaSerializationExample {
public static void main(String[] args) {
Person person = new Person("Bob", 25);
// 序列化
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
oos.writeObject(person);
System.out.println("Serialized object is saved in person.ser");
} catch (IOException e) {
e.printStackTrace();
}
// 反序列化
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person deserializedPerson = (Person) ois.readObject();
System.out.println("Deserialized object is: " + deserializedPerson);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
在上面的示例中,我们定义了一个Person类,该类实现了Serializable接口。然后,我们创建了一个Person对象,并使用ObjectOutputStream将其序列化到文件person.ser中。接下来,我们使用ObjectInputStream从文件person.ser中反序列化Person对象。
需要注意的是,Java序列化API序列化的对象必须是可序列化的,即该类必须实现Serializable接口。此外,Java序列化API序列化的对象的状态信息可以包括对象的成员变量以及对象引用的其他对象的状态信息。在反序列化时,Java虚拟机会根据对象图中的引用关系重新构建对象。