java-反序列化invalidclassexception(无有效构造函数)

vwhgwdsa  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(353)

我正在尝试序列化一个对象,然后在将其数据发送到客户端程序后反序列化它。
下面是一个对象继承工作原理的示例。我正在序列化和反序列化的对象是person。
生活->动物->npc->人->孩子
living、animal和npc不实现序列化。我不能改变这三门课。person和child不实现序列化。人和生活也是抽象的类。我可以序列化一个人(他是一个孩子)并发送它,但是当我试图反序列化一个人(他是一个孩子)时,我在child上得到一个invalidclassexception,说“没有有效的构造函数”。
为什么会这样?生活、动物和npc都必须实现序列化吗?

jk9hmnmh

jk9hmnmh1#

我在hazelcast的序列化中也遇到了同样的问题,但是通过使用自定义序列化,在不借助中间类的情况下解决了这个问题。我向animal类添加了一个空的no arg构造函数,并实现了person类,如下所示:

class Person extends Animal implements Serializable {

    private void writeObject(ObjectOutputStream o) throws IOException {
        o.writeObject(this.fieldA);
        o.writeObject(this.fieldB);
        o.writeObject(this.fieldC);
        ...
    }

    private void readObject(ObjectInputStream o) throws IOException, ClassNotFoundException {
        this.fieldA = (TypeOfA) o.readObject();
        this.fieldB = (TypeOfB) o.readObject();
        this.fieldC = (TypeOfC) o.readObject();
        ...
    }
}
pxiryf3j

pxiryf3j2#

下面的问题对反序列化arraylist做了很好的解释。没有有效的构造函数
长话短说-对于类的第一个不可序列化的超类,不需要arg构造函数, NPC 对你来说。
如果您没有访问npc的权限,并且它不包含arg构造函数,那么您可以向层次结构中添加一个“fake”类,该类将选择正确的类。例如

class SomeClass extends NPC {
// will be called during deserialization
public SomeClass(){
// call custom constructor of NPC
super(null);
}
}

class Person extends SomeClass implements Serializable {
// ..
}
u3r8eeie

u3r8eeie3#

对于这个线程,它们不需要实现serializable,但是它们(或者至少是npc,因为它是继承结构中第一个不可序列化的类)必须包含一个0参数构造函数。如果类中没有定义构造函数,则隐式构造函数是adaquate,但是如果在这些类中定义了其他构造函数,则必须编写显式0参数构造函数。
由于无法控制npc,请尝试创建它的子级,该子级定义显式的0-param构造函数,但不实现serializable,然后查看是否这样做。

相关问题