当前位置: 首页 > 面试题库 >

ObjectOutputStream对象如何调用可序列化对象的私有writeObject方法

程仲卿
2023-03-14
问题内容

当我运行此演示时,它称为私有的TestBean writeObject方法

这怎么可能 ?

这是代码:

import java.io.FileOutputStream;

public class Test {

    public static void main(String[] args) {

        try {
            TestBean testBean = test.new TestBean();

            testBean.setSize(23);
            testBean.setWidth(167);

            FileOutputStream fos =
                new FileOutputStream(new File("d:\\serial.txt"));
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(testBean);

            oos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    class TestBean implements Serializable {

        private static final long serialVersionUID = 1L;

        private int size;
        private int width;

        public int getSize() {
            return size;
        }

        public void setSize(int size) {
            this.size = size;
        }

        public int getWidth() {
            return width;
        }

        public void setWidth(int width) {
            this.width = width;
        }

        private void writeObject(ObjectOutputStream out) throws IOException {
            System.out.println("TestBean writeObject");
            out.defaultWriteObject();
        }

        private void readObject(ObjectInputStream input) throws IOException,
                                                                ClassNotFoundException {
            System.out.println("TestBean readObject ===================> ");
            input.defaultReadObject();
        }
    }
}

问题答案:

如果您的可序列化对象具有任何writeObject方法,则将调用该对象,否则将调用defaultWriteObject方法。

使用反射可以调用私有方法。如果您在该方法writeSerialData中看到ObjectOutputStream类的源代码,则下面的代码将回答您的问题。

if (slotDesc.hasWriteObjectMethod()) {
 // through reflection it will call the Serializable objects writeObject method
} else {
// the below is the same method called by defaultWriteObject method also.
writeSerialData(obj, desc);
}


 类似资料:
  • 我正在创建一个eclipse插件:一个使用eclipse的JDT库的重构工具。该项目的一部分是利用另一个库,这是一种流程编程语言,它要求对象是可序列化的,以便在步骤之间传递。我希望我能改变这一点,但我不能,所以我需要一种方法来使AST对象可序列化。 我的第一次尝试是定义一个实现Serializable并保存瞬态AST的代理类,并使用XStream和GSON等库来实际序列化和反序列化AST。然而,我

  • 问题内容: 我正在寻找对JSON的增强,该增强还将对方法进行序列化。我有一个对象,它充当对象的集合,并且还希望序列化集合对象的方法。到目前为止,我已经找到了ClassyJSON。有什么想法吗? 问题答案: 我认为序列化方法从来都不是一个好主意。如果打算在服务器端运行代码,则容易受到攻击。如果要在客户端运行它,最好不要使用本地方法,最好引用要在序列化对象中使用的方法的名称。 我确实相信这会为您提供一

  • 然后是班级选拔: 教材: 因此,我主要创建新用户并将其序列化: 一切都很完美,但如果我这样做: 然后我想序列化对象用户,程序崩溃了。我得到的结果是: JAVA木卫一。NotSerializableException:在java上。木卫一。ObjectOutputStream。java上的WriteObject 0(ObjectOutputStream.java:1183)。木卫一。ObjectOu

  • 我有以下用于序列化查询集的代码: 下面是我的 我需要将其序列化。但它说无法序列化

  • 我正在遵循scala对象序列化的基本示例。但是,当运行下面的单元测试时 我有个例外: org.scalatest.assertions$assertionshelper java.io.NotSerializableException:在java.io.ObjectOutputStream.WriteObject0(ObjectOutputStream.java:1184)在java.io.Obj

  • 问题内容: 我有一个问题。我想使用JAXB将一个对象转换为另一个对象。就像在中,我有一个class 和另一个class ,它们都有相同的参数,实际上都是相同的(复制粘贴),但是包不同。我想使用进行它们之间的转换。 怎么做,请帮帮我。 问题答案: 您可以执行以下操作。 注意: 不需要利用JAXBSource将数据具体化为XML。 它在对象模型上不需要任何注释。 com.home.Student co