【发布时间】:2017-01-14 05:42:06
【问题描述】:
我有一个实现 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 行 - readObject 的输入参数********
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 行 - readObject 的输入参数********
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)时,它有一个输入参数。怎么不报错。
【问题讨论】:
-
ois是一个ObjectInputStream。ois.readObject()调用类ObjectInputStream的函数readObject,而不是类Dog2。 -
在 标记的第 1a 行上,您是在
ObjectInputStream上而不是在您的对象上调用readObject()。 -
如果它正在调用 ObjectInputStream 的 readObject() 而不是 Dog2,那么如果我删除行“ois.defaultReadObject();”从 Dog2 的 readObject 函数中,程序没有运行,它抛出一个错误。我在 Dog 2 类的 readObject() 中有一些可访问的代码,如果没有该可访问的代码,该程序将无法运行。所以 Dog2 类的 readObject() 被调用,而不是 ObejctInputStreams(我正在将 ObjectInputStream 对象 - “ois”转换为 Dog2)
标签: java function serialization call signature