【发布时间】:2018-09-23 23:51:49
【问题描述】:
我正在学习自定义序列化,但我不明白如何覆盖 writeObject() 和 readObject() 这两个方法,因为我知道这两个方法是最终的,而且我知道最终方法不能被覆盖.
ObjectOutputStream 中的 writeObject() 方法:
public final void writeObject(Object obj) throws IOException
并且 writeObject() 需要像这里一样被覆盖:
private void writeObject(ObjectOutputStream output) throws IOException
我知道新的 writeObject() 方法是私有的,但它是通过 Java 序列化机制使用反射调用的。但我不明白如何覆盖最终方法。
帐户类别:
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Account implements Serializable {
private static final long serialVersionUID = 154754873L;
String userName = "durga";
transient String psw = "anushka";
private void writeObject(ObjectOutputStream output) throws IOException {
output.defaultWriteObject();
output.writeObject(psw);
}
private void readObject(ObjectInputStream input) throws IOException, ClassNotFoundException {
input.defaultReadObject();
psw = (String) input.readObject();
}
}
序列化演示类:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class SerializationDemo {
public void serialize(Account a1, String fileName) {
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName))) {
oos.writeObject(a1);
} catch (FileNotFoundException ex) {
System.out.printf("ERROR: %s", ex);
} catch (IOException ex) {
System.out.printf("ERROR: %s", ex);
}
}
public Account deserialize(String fileName) {
Account a2 = null;
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("account.ser"))) {
a2 = (Account) ois.readObject();
} catch (FileNotFoundException ex) {
System.out.printf("ERROR: %s", ex);
} catch (IOException | ClassNotFoundException ex) {
System.out.printf("ERROR: %s", ex);
}
return a2;
}
}
SerializationApp 类:
public class SerializationApp {
public static void main(String args[]) {
Account a1 = new Account();
System.out.println(a1.userName + " " + a1.psw);
SerializationDemo demo = new SerializationDemo();
demo.serialize(a1, "account.ser");
Account a2 = demo.deserialize("account.ser");
System.out.println(a2.userName + " " + a2.psw);
}
}
【问题讨论】:
-
你不能覆盖最终方法,但你甚至没有尝试过,因为
writeObject(ObjectOutputStream output)是writeObject(Object obj)的重载,而不是覆盖 -
为什么要覆盖
ObjectOutputStream中的writeObject?在您的班级中提供writeObject和readObject方法还不够吗?为什么? -
我知道这是为了学习,但你以后应该远离 Serializeable。它被普遍认为是坏的。几个库中有更好的实现。
-
@killjoy 当然不是“普遍认为不好”。它是 Java 中大量其他事物的基础。不要草率地概括。
标签: java serialization overriding private final