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
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 {
// ..
}
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.
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();
...
}
}