2012-08-25 24 views
14

Próbuję serializować obiekt, a następnie deserializować go po wysłaniu jego danych do programu klienckiego.Java - deserializacja InvalidClassException (brak poprawnego konstruktora)

Oto przykład, jak działa dziedziczenie obiektu. Obiekt, który serializuję i deserializuję, jest osobą.

Living -> Animal -> NPC -> Person -> Dziecko

Living, zwierząt, a NPC nie wdrożyć Serializable. Nie mogę zmienić tych trzech klas. Osoba i dziecko implementują Serializable. Osoba i życie to także zajęcia abstrakcyjne. Mogę serializować Osobę (która jest Dzieckiem) dobrze i wysłać ją, ale kiedy próbuję deserializować Osobę (która jest Dzieckiem), dostaję InvalidClassException na Dziecku, mówiąc "brak prawidłowego konstruktora".

Dlaczego tak się dzieje? Must Living, Animal i NPC wszystkie implementują Serializable?

+3

prawdopodobnie istotne: http://stackoverflow.com/questions/8632148/java-object-serialization-and-inheritance – leonbloy

Odpowiedz

13

Dobre wyjaśnienie odbywa się w odpowiedzi na następujące pytanie Deserializing an ArrayList. no valid constructor

Krótko mówiąc - trzeba nie-Arg konstruktor pierwszego nonserializable super klasy swojej klasie, NPC w Twoim przypadku.

Jeśli nie masz dostępu do NPC i nie zawiera ona konstruktora no-arg - możesz dodać jeszcze jedną "fałszywą" klasę do hierarchii, która wybierze właściwą. Na przykład.

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

To się udało! Dzięki. – WildBamaBoy

2

za this thread, nie trzeba zaimplementować Serializable, ale oni (lub przy minimalnej NPC, ponieważ jego pierwszy zakaz serializable klasa w heirarchy) musi zawierać konstruktor 0-parametru. jeśli w klasach nie zdefiniowano żadnych konstruktorów, niejawny konstruktor jest adekwatny, ale jeśli w tych klasach zdefiniowano inne konstruktory, należy napisać jawny konstruktor 0-parametrowy.

Ponieważ nie możesz kontrolować NPC, spróbuj utworzyć jego potomek, który definiuje jawny konstruktor 0-param, ale nie implementuje Serializowalnego i zobacz, czy to nie robi.

0

Napotkałem ten sam problem z serializacją Hazelcast, ale rozwiązałem go bez uciekania się do klasy pośredniej, używając niestandardowej serializacji. Dodałam pustą no-Arg konstruktora klasy Zwierząt i wdrożone klasę Person następująco:

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(); 
     ... 
    } 
} 
Powiązane problemy