📅  最后修改于: 2023-12-03 15:32:02.141000             🧑  作者: Mango
Java中的序列化(Serialization)是指将对象转化成可存储或传输的格式。反序列化(Deserialization)则是将序列化的数据重新还原为对象。Java提供了默认的序列化和反序列化方法,但是在某些情况下,我们需要对对象的序列化过程进行定制化,这就是自定义序列化和反序列化。
要自定义序列化和反序列化,需要让类实现Serializable接口,并自定义writeObject和readObject方法。
private void writeObject(java.io.ObjectOutputStream out)
throws IOException {
out.defaultWriteObject(); // 调用默认的序列化方法
out.writeInt(age); // 自定义序列化
}
在自定义序列化方法中,需要先调用默认的序列化方法,将对象的默认属性写入到输出流中,然后再写入自定义属性。在上述代码中,我们首先调用了默认的序列化方法,然后再写入了对象的age属性。这样,我们就完成了自定义序列化的过程。
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException {
in.defaultReadObject(); // 调用默认的反序列化方法
age = in.readInt(); // 自定义反序列化
}
在自定义反序列化方法中,同样需要先调用默认的反序列化方法,将对象的默认属性读出来,然后再读出自定义属性。在上述代码中,我们首先调用了默认的反序列化方法,然后再读出了对象的age属性。这样,我们就完成了自定义反序列化的过程。
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;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
private void writeObject(java.io.ObjectOutputStream out)
throws IOException {
out.defaultWriteObject();
out.writeInt(age);
}
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException {
in.defaultReadObject();
age = in.readInt();
}
}
我们定义了一个Person类,实现了Serializable接口,并自定义了writeObject和readObject方法。现在我们可以进行序列化和反序列化的测试。
public static void serialize(Person person, String fileName) throws IOException {
FileOutputStream fileOut = new FileOutputStream(fileName);
ObjectOutputStream outStream = new ObjectOutputStream(fileOut);
outStream.writeObject(person);
outStream.close();
fileOut.close();
}
在序列化方法中,我们首先创建一个文件输出流,然后创建一个对象输出流,并将Person对象写入到输出流中。最后关闭输出流和文件输出流。
public static Person deserialize(String fileName) throws IOException, ClassNotFoundException {
FileInputStream fileIn = new FileInputStream(fileName);
ObjectInputStream in = new ObjectInputStream(fileIn);
Person person = (Person) in.readObject();
in.close();
fileIn.close();
return person;
}
在反序列化方法中,我们首先创建一个文件输入流,然后创建一个对象输入流,从输入流中读取Person对象。最后关闭输入流和文件输入流,并返回读取到的Person对象。
自定义序列化和反序列化是一种定制化的序列化方式,可以让我们对序列化的过程做出个性化的调整。虽然使用起来需要一定的注意点,但是当我们需要对数据进行更精细的控制时,自定义序列化和反序列化是非常好的选择。