【问题标题】:wrong parameter passes to a function and it still works (customized serialization)错误的参数传递给函数,它仍然有效(自定义序列化)
【发布时间】: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 是一个ObjectInputStreamois.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


【解决方案1】:

ObjectInputStream.readObject() 不带参数调用反序列化对象的readObject(ObjectInputStream ois) 方法,如果它存在,那么它又应该调用ObjectInputStream.defaultReadObject()。这是三种不同的方法,它们都不是任何其他方法的覆盖。

【讨论】:

  • @KhushbooSingh “不覆盖”和“我们如何进行投射?”之间没有联系。不清楚你在问什么。
  • @KushbooSingh 我不知道ObjectInputStream's Object ois 是什么意思。 oisObjectInputStream,而不是 Object。您只需要知道ObjectInputStream.readObject() 创建了一个正确类型的对象。
  • @KhushbooSingh 你没有任何意义。 ois 没有被转换为 Dog2ois.readObject()结果 被转换为 Dog2
  • 感谢您解决这个问题。现在有道理了。另外,能否请您附上一个oracle文档以参考您对不带参数的ObjectInputStream.readObject()如何调用反序列化对象的readObject(ObjectInputStream ois)的解释。我需要知道 ObjectInputStream.readObject 是否在内部调用了 Dog2 类的 readObject?所以你的解释是有道理的,即使它是正确的,知道如何做会很棒吗?谢谢
  • @KhushbooSingh 确实如此。我已经回答过了。在我的回答中。多于。您可以在对象序列化规范中找到所有这些。注意:您对选角的困惑是由于误读为((Dog2)ois).readObject() 而实际上是(Dog2)(ois.readObject())。只是一个语法误解。
猜你喜欢
  • 2011-12-01
  • 2022-07-06
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
相关资源
最近更新 更多