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



我有一个实现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()。这是三种不同的方法,它们都不是其他任何方法的覆盖。

相关内容

最新更新