错误的参数传递给一个函数,它仍然有效(自定义序列化)

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 是对任何其他方法的覆盖。