Warum erhalte ich eine InvalidClassException 'kein Gültiger Konstruktor', wenn Erben von einer abstrakten Serialisierbar?
hier ist der code (vereinfacht):
public abstract class PageBase implements Serializable {
private static final long serialVersionUID = -31905358958878336L;
}
public abstract class ListPage extends PageBase {
public Controller getController() {
//Controller is a class
//that implements Serializable and does have an def. constr.
return new Controller() {
@Override
public void someMethod() {
//DoSomething
}
};
}
}
public class ProjectList extends ListPage {
}
und durch Deserialisierung es wirft:
java.io.InvalidClassException: my.pkg.page.ListPage$1; no valid constructor
Die Deserialisierung stattfindet, irgendwo in der IBM JSF-Code.
Irgendwelche Ideen? Danke!
- zeigen Sie den code instanziiert das Objekt und übergibt es für die Serialisierung
- Sorry, ich habe nicht diese Informationen - es ist das JSF-Framework, das versucht, die Deserialisierung...
- Sie haben also nicht erstellt eine anonyme innere Klasse von ListPage irgendwo?
- Tatsächlich, ich haben. Vielen Dank für diesen Hinweis - Bitte siehe meine edits. Aber warum würde der Konstruktor der Klasse eine Rolle?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde vorschlagen, die Definition der anonymen
Controller
als eine separate Klasse.my.pkg.page.ListPage$1
wird eine anonyme innere Klassen. Serialisaing verschachtelten Klassen ist nicht eine gute Idee, in den besten Zeiten (schlechtes mapping, um die volle JVM-Namen und Umgang mit "äußeren dieses" Referenzen).Ausnahme sieht aus, als wenn es versucht, zu finden, die den no-arg-Konstruktor für die abgeleitete, nicht-
Serializable
Basis-Klasse, die verfügbar sein müssen, um die am wenigsten abgeleitetenSerializable
Klasse.Ich denke, dass das problem ist, dass die Unterklasse von
Controller
ist eine nicht-statische innere Klasse und der Konstruktor hat ein implizites argument, das bezieht sich auf die Instanz der umschließenden Klasse. Dies macht den Konstruktor unbrauchbar für die Objekt-Deserialisierung.Es ist eine schlechte Idee, zu versuchen, diese Objekte serialisieren, aber wenn Sie ändern die innere Klasse, so dass es
static
Deserialisierung arbeiten kann.Sie versuchen, zu serialisieren, die eine abstrakte Klasse, die durch die definition, kann nicht instanziiert werden.
Das heißt, mit Ihrer definition ListPage, können Sie nicht tun:
ListPage l = new ListPage();
Entfernen Sie die abstrakte Kennzeichnung von ListPage und ProjectList, und alles wird in Ordnung sein.
Einer serialisiert Objekte, keine Klassen, keine? Alle Klassen, die Sie gezeigt haben, sind abstrakte, so kann Sie nicht instantiatiated, also was ist es, dass Sie (de -) serialisieren?
Den Fehler verweist auf die Klasse als "ListPage$1" -- einer anonymen inneren Klasse. Ich denke, wir brauchen würde, um zu sehen, mehr von dem code zu verstehen, was Los ist.