【问题标题】:Do I need explicit default constructor when implementing Externalizable?实现 Externalizable 时是否需要显式默认构造函数?
【发布时间】:2021-04-24 23:36:28
【问题描述】:

我知道如果类 A 实现 Externalizable 它应该有无参数构造函数,但如果类没有任何构造函数(比如我的 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.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2061) 在 java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594) 在 java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:430) 在 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 {}
}

【问题讨论】:

标签: java externalizable


【解决方案1】:

Externalizable 需要 public 无参数构造函数,但提供的无参数构造函数具有默认访问修饰符(也称为包私有) 试试这个:public class A() {}

【讨论】:

  • 如果其他没有提供,java是否提供不公开的无参数构造函数?
  • 该类必须是公开的。无参数构造函数将照常提供。
  • 公共构造函数不会使包访问类神奇地变成公共类。能够调用构造函数是一项要求,但对类的访问也是一项隐含要求。
猜你喜欢
  • 1970-01-01
  • 2021-05-25
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多