Java - Deserialization InvalidClassException (No valid constructor)

后端 未结 3 1500
长发绾君心
长发绾君心 2021-02-19 02:33

I\'m trying to serialize an object and then deserialize it after sending its data to a client program.

Here\'s an example of how the object\'s inheritance works. The obj

相关标签:
3条回答
  • 2021-02-19 03:03

    Good explanation is done in answers for following question Deserializing an ArrayList. no valid constructor

    Long story short - you need no-arg constructor for first nonserializable super class of your class, NPC in your case.

    If you don't have an access to NPC and it doesn't contain no-arg constructor - then you can add one more 'fake' class to hierarchy which will choose the correct one. E.g.

    class SomeClass extends NPC {
    // will be called during deserialization
    public SomeClass(){
    // call custom constructor of NPC
    super(null);
    }
    }
    
    class Person extends SomeClass implements Serializable {
    // ..
    }
    
    0 讨论(0)
  • 2021-02-19 03:16

    per this thread, they do not need to implement Serializable, but they (or at a minimum NPC because its the first non-serializable class in the heirarchy) must contain a 0-parameter constructor. if no constructors are defined in the classes, the implicit constructor is adaquate, but if you have other constructors defined in those classes, you must write an explicit 0-parameter constructor.

    Since you cannot control NPC, try creating child of it that defines an explicit 0-param constructor but that does not implement Serializable, and see if that doesn't do it.

    0 讨论(0)
  • 2021-02-19 03:21

    I faced the same issue with Hazelcast's serialization, but solved it without resorting to an intermediary class, by using custom serialization. I added an empty no-arg constructor to the Animal class and implemented the Person class as follows:

    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();
            ...
        }
    }
    
    0 讨论(0)
提交回复
热议问题