我有一个实现Serializable并覆盖其函数的类 - writeObject 和 readObject。
为什么在调用函数 readObject() 时没有传递参数,但在定义被覆盖的参数时有一个参数。它甚至不是一个参数,后跟任意数量的参数签名[如:(int i...)]
这段代码是如何工作的:
//I understand this part:
package CustomizedSerialization;
import java.io.Serializable;
public class Cat implements Serializable
{
int k = 30;
int j = 10;
char c = 'c';
}
package CustomizedSerialization;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Dog2 implements Serializable
{
transient Cat c = new Cat();
private void writeObject(ObjectOutputStream oos) throws IOException
{
int x = c.j;
oos.writeInt(x);
}
标记行 1a - 读取对象的输入参数********
private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException
{
ois.defaultReadObject();
c = new Cat();
}
}
package CustomizedSerialization;
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 SerializeDemo2 {
public static void main(String[] args) throws IOException, ClassNotFoundException
{
Dog2 d = new Dog2();
System.out.println("Before serialization "+ d.c.j);
FileOutputStream fos = new FileOutputStream("C:\serializedFile.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(d);
System.out.println("After serialization");
FileInputStream fis = new FileInputStream("C:\serializedFile.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
标记行 1a - 读取对象的输入参数********
Dog2 d1 = (Dog2) ois.readObject();
System.out.println(d1.c.j);
System.out.println(d1.c.c);
}
}
程序(Dog2 和 SerializeDemo2)中的"标记为 1 a 的行"是如何工作的?SerializeDemo2 调用类 Dog2 的函数 readObject 没有任何参数,但在类 Dog2 中定义被调用的函数 (readObject) 时,它有一个输入参数。怎么不抛出错误。
参数ObjectInputStream.readObject()
调用反序列化对象的readObject(ObjectInputStream ois)
方法(如果存在),并且反过来应该调用ObjectInputStream.defaultReadObject()
。这是三种不同的方法,它们都不是其他任何方法的覆盖。