java.io.WriteAbortedException: das schreiben abgebrochen; java.io.NotSerializableException
Was sind die Ursachen dieser Art von Fehler in Tomcat?
SEVERE: Exception loading sessions from persistent storage
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException:
bean.ProjectAreaBean
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1333)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at java.util.ArrayList.readObject(ArrayList.java:593)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(
DelegatingMethodAccessorImpl.java:25)
InformationsquelleAutor der Frage deven | 2010-02-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einfach umzusetzen
Serializable
Wenn Sie eine
NotSerializableException
wie folgt,dann ist es einfach bedeutet, dass die Klasse, wie identifiziert mit dem voll qualifizierten Namen in der exception-Nachricht (die
bean.ProjectAreaBean
in Ihrem Fall) nicht implementiertSerializable
- Schnittstelle, während es wurde erwartet, dass durch den code hinter. Befestigung ist es relativ einfach, lasst einfach die Klasse implementieren, dieSerializable
- Schnittstelle.Den
serialVersionUID
Feld ist nicht notwendig, wird aber dringend empfohlen, weil dadurch die binäre Kompatibilität zwischen den verschiedenen Versionen der Klasse und die serialisierten Darstellungen Ihrer Instanzen. Also, wenn Sie später hinzufügen eines neuen serializable Feld der Klasse, dann würden Sie sich ändern müssen, dieserialVersionUID
Feld (in der Regel nur die Inkrementierung um 1 ist ausreichend), um zu verhindern, dass Probleme bei der Deserialisierung von einer Instanz von einer älteren version der Klasse. IDEs wie Eclipse bieten auch eine Möglichkeit zum (re)generieren, dieserialVersionUID
Wert, die im Grunde ist ein hash berechnet auf der Basis aller Felder.Siehe auch:
Mark unserializable Felder
transient
Wenn Ihr
Serializable
Klasse enthält wiederum ein Feld/property verweisen auf eine Instanz einer anderen Klasse, die können absolut nichtSerializable
dann würden Sie brauchen, um Sie zu markierentransient
. Auf diese Weise wird es übersprungen werden, die während der Serialisierung der Klasse.Müssen Sie verstehen, dass nach der Deserialisierung dieses Feld würde immer
null
. Beachten Sie, dass die Klasse' Konstruktor und Initialisierung Blöcke sind nicht während der Deserialisierung aufgerufen. Wenn Sie möchten, haben feinere Kontrolle über die Serialisierung und Deserialisierung, dann überschreiben Sie diereadObject()
undwriteObject()
Methoden. Finden Sie konkrete Beispiele in unten links:Warum Serialisierung?
Als der warum man sich Gedanken machen muss über die Serialisierung, das ist, weil die meisten Java-servlet-Container wie Tomcat erfordern Klassen zu implementieren
Serializable
wenn Instanzen dieser Klassen gespeichert als Attribut desHttpSession
. Das ist, weil dieHttpSession
können gespeichert werden auf der lokalen Festplatte die Datei-system, oder sogar übertragen Sie über das Netzwerk, wenn der servlet-container benötigt, um das Herunterfahren/neu starten oder gelegt wird, in einem cluster von Servern, wobei die Sitzung synchronisiert werden.In um der Lage sein, speichern von Java-Objekten auf der lokalen Festplatte die Datei-system oder übertragen Sie Sie über das Netzwerk, Sie müssen umgewandelt werden in ein byte-stream-den ersten (im Grunde: ein
byte[]
oder eineInputStream
) und das ist nur möglich, wenn die Klasse sich hinter dem Objekt implementiertSerializable
. DieSerializable
Schnittstelle selbst ist nicht wirklich etwas tun, es ist lediglich ein die "marker" - interface.Siehe auch:
java.io.Serializable
javadocInformationsquelleAutor der Antwort BalusC
Müssen Sie
bean.ProjectAreaBean
serializable.InformationsquelleAutor der Antwort Thilo