📅  最后修改于: 2023-12-03 14:42:43.217000             🧑  作者: Mango
在Java中,对象序列化是指将对象转换为可存储或可传输的格式的过程。对象序列化通常用于将对象保存到文件中,或者将对象传输到网络上的另一台计算机。Java中的对象序列化可以通过实现Serializable接口来实现。在继承关系中,如果父类和子类都需要序列化,那么需要对父类和子类都实现序列化接口。
通过实现Serializable接口,可以让Java对象变为可序列化的对象。如果需要在序列化过程中考虑到继承关系,则需要在父类和子类中都实现Serializable接口。下面是一个示例代码:
import java.io.Serializable;
public class Animal implements Serializable {
private String name;
private int age;
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class Dog extends Animal implements Serializable {
private String breed;
public Dog(String name, int age, String breed) {
super(name, age);
this.breed = breed;
}
public String getBreed() {
return breed;
}
}
在上面的示例代码中,Animal和Dog都实现了Serializable接口。子类Dog通过super调用父类的构造方法,并添加了名为breed的成员变量。
在Java中,使用ObjectOutputStream类可以序列化对象。下面是一个序列化Animal和Dog对象的示例代码:
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class SerializationDemo {
public static void main(String[] args) {
Animal animal = new Animal("Cat", 5);
Dog dog = new Dog("Dog", 3, "Golden Retriever");
try {
FileOutputStream fileOut = new FileOutputStream("animals.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(animal);
out.writeObject(dog);
out.close();
fileOut.close();
System.out.println("Serialized data is saved in animals.ser");
} catch (IOException i) {
i.printStackTrace();
}
}
}
上面的示例代码将Animal和Dog对象序列化到文件animals.ser中。ObjectOutputStream的writeObject方法将对象写入文件中。在序列化过程中,Dog类中的成员变量也会被序列化在一起。
在Java中,使用ObjectInputStream类可以反序列化对象。下面是一个反序列化Animal和Dog对象的示例代码:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class DeserializationDemo {
public static void main(String[] args) {
Animal animal;
Dog dog;
try {
FileInputStream fileIn = new FileInputStream("animals.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
animal = (Animal) in.readObject();
dog = (Dog) in.readObject();
in.close();
fileIn.close();
} catch (IOException i) {
i.printStackTrace();
return;
} catch (ClassNotFoundException c) {
System.out.println("Animal or Dog class not found");
c.printStackTrace();
return;
}
System.out.println("Deserialized Animal data:");
System.out.println("Name: " + animal.getName());
System.out.println("Age: " + animal.getAge());
System.out.println("Deserialized Dog data:");
System.out.println("Name: " + dog.getName());
System.out.println("Age: " + dog.getAge());
System.out.println("Breed: " + dog.getBreed());
}
}
上面的示例代码从文件animals.ser中读取并反序列化Animal和Dog对象。ObjectInputStream的readObject方法读取文件中的对象。由于在序列化时,Dog类也被序列化在一起,因此可以通过强制类型转换,将读取到的对象转换成对应的类型。最后输出反序列化后的Animal和Dog对象中的成员变量。
使用Java中的对象序列化可以将对象转换为可存储或可传输的格式,方便地进行文件存储或网络传输。在继承关系中,需要同时在父类和子类中实现Serializable接口,才能正确地将父类和子类对象序列化和反序列化。