Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java - Deserialization InvalidClassException (No valid constructor)

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?

like image 328
WildBamaBoy Avatar asked Aug 25 '12 19:08

WildBamaBoy


1 Answers

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 {
// ..
}
like image 133
udalmik Avatar answered Sep 27 '22 19:09

udalmik