错误的参数传递给一个函数,它仍然有效(自定义序列化)
wrong parameter passes to a function and it still works (customized serialization)
我有一个 class,它实现了 Serializable 并覆盖了它的函数 - writeObject 和 readObject。
为什么在调用函数 readObject() 时没有传递任何参数,但在定义重写时却有一个参数。它甚至不是一个参数后跟任意数量的参数签名[ like: (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)中的 "line marked 1 a" 如何工作? SerializeDemo2 调用class Dog2 的函数readObject 时没有任何参数,但是在class Dog2 中定义被调用函数(readObject)时,它有一个输入参数。怎么不报错呢
ObjectInputStream.readObject()
不带参数调用反序列化对象的 readObject(ObjectInputStream ois)
方法(如果存在),而后者又应调用 ObjectInputStream.defaultReadObject()
。这是三种不同的方法,其中 none 是对任何其他方法的覆盖。
我有一个 class,它实现了 Serializable 并覆盖了它的函数 - writeObject 和 readObject。
为什么在调用函数 readObject() 时没有传递任何参数,但在定义重写时却有一个参数。它甚至不是一个参数后跟任意数量的参数签名[ like: (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)中的 "line marked 1 a" 如何工作? SerializeDemo2 调用class Dog2 的函数readObject 时没有任何参数,但是在class Dog2 中定义被调用函数(readObject)时,它有一个输入参数。怎么不报错呢
ObjectInputStream.readObject()
不带参数调用反序列化对象的 readObject(ObjectInputStream ois)
方法(如果存在),而后者又应调用 ObjectInputStream.defaultReadObject()
。这是三种不同的方法,其中 none 是对任何其他方法的覆盖。