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 object I'm serializing and deserializing is person.
Living -> Animal -> NPC -> Person -> Child
Living, Animal, and NPC do not implement Serializable. I can not change those three classes. Person and Child do implement Serializable. Person and Living are also abstract classes. I can serialize a Person (who is a Child) just fine and send it, but when I attempt to deserialize a Person (who is a Child), I get an InvalidClassException on Child, saying "no valid constructor".
Why is this happening? Must Living, Animal, and NPC all implement Serializable?
解决方案
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 {
// ..
}