当前位置: 首页 > 知识库问答 >
问题:

实现Externalizable时需要显式默认构造函数吗?

章涵蓄
2023-03-14

我知道,如果类A实现了外部化,它应该有无参数的构造函数,但是如果类没有任何构造函数(就像我的A类),java会为它提供空的无参数的构造函数。那为什么我有个错误呢?如果将无参数构造函数(public A(){})显式添加到A类,则一切都将正常。
错误:

线程“main”java.io.InvalidClassException中的异常:a;java.base/java.io.ObjectStreamClass$ExceptionInfo.NewInvalidClassException(ObjectStreamClass.java:159)在java.base/java.io.ObjectStreamClass.CheckDeserialize(ObjectStreamClass.java:864)在java.base/java.io.ObjectTinputStream.ReadOrdinaryObject(ObjectTinputStream.java:2061)在java.base/java.io.ObjectTinputStream.ReadObject0(ObjectTinputStream.java:1594)在test.main(test.java:19)在

import java.io.*;

public class Test implements Serializable
{
    public static void main(String[] args) throws IOException, ClassNotFoundException
    {

        // initiaizing
        A a1 = new A();

        // serializing
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(a1);
        oos.close();

        // deserializing
        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
        A a2 = (A) ois.readObject();
    }
}

class A implements Externalizable
{
    @Override
    public void writeExternal(ObjectOutput objectOutput) throws IOException {}

    @Override
    public void readExternal(ObjectInput objectInput) throws IOException, ClassNotFoundException {}
}

共有1个答案

徐麒
2023-03-14

Externalizable需要public无参数构造函数,但如果无参数构造函数具有默认访问修饰符(也称为package private),请尝试以下操作:public class a(){}

 类似资料:
  • 问题内容: 除了* 使用如下所示的反射检查 之外 ,是否有任何方法 要求 类具有默认(无参数)构造函数?(以下方法可以工作,但是很hacky,反射速度很慢) * 问题答案: 您可以为此构建一个注释处理器。注释处理器是在编译时运行的编译器插件。它们的错误显示为编译器错误,甚至可能停止构建。 这是一个示例代码(尽管我没有运行它): 如果引入注释(例如RequiresDefaultAnnotation)

  • 问题内容: 可以这么说,我有一个扩展超类的子类。在什么情况下我需要显式键入以使超类构造函数运行? 我正在看一本书中有关抽象类的示例,当它们使用非抽象子类对其进行扩展时,该子类的默认构造函数为空,并且有一条评论说将调用超类的默认构造函数。同时,我还在这里看到有人未明确致电问题的实例。 与从子类的默认/非默认构造函数调用超类的默认/非默认构造函数有区别吗? 问题答案: 你 永远都不 需要 如果您不指定

  • 问题内容: 默认构造函数到底是什么?你能告诉我以下哪个是默认构造函数,它与其他构造函数有何不同? 问题答案: 他们都不是。如果定义,则不是默认值。 除非你定义另一个构造函数,否则默认构造函数是自动生成的无参数构造函数。任何未初始化的字段都将设置为其默认值。对于你的榜样,它看起来像这样假设的类型String,int以及int,那类本身是公共的: 这与 完全没有构造函数。但是,如果定义至少一个构造函数

  • 问题内容: 当未定义构造函数时,它工作正常,但如果我定义了一个参数化的构造函数而不是默认的构造函数, 并且在创建对象时未传递任何值, 则会出错。我认为构造函数是预定义的。 如果定义了参数化构造函数,为什么需要定义默认构造函数?默认构造函数不是预定义的吗? 问题答案: 仅 当您自己未定义任何构造函数时, 才会 自动创建默认(无参数)构造函数。 如果需要两个构造函数,一个带有参数,另一个不带参数,则需

  • 问题内容: 我遇到这个错误: 不知道为什么我得到那个例外 我正在运行 主要 这是我的 课 当我保存,更新和删除它时,它可以正常工作,所以我不知道我在做什么错 EDIT1 在这里是principal.Cliente 问题答案: 我可以说缺少默认构造函数,

  • 问题内容: 我知道我在这里问一些严重的101问题… 我有一些课,还有一个延伸课。在我有一个构造函数,它接受一组参数,并对其字段进行设置。派生类(例如)通常不需要进行修改。现在我的IDE给我 “ Foo中没有默认的构造函数” 。从一点点谷歌搜索,这似乎是因为“构造函数没有继承”。因此,一切都很好,但是我现在如何使它工作而不在每个派生类中复制此构造函数?我假设有一个更合理的方法? 问题答案: 使用构造