In Bezug auf Serialisierung, serialVersionUID und inkompatible Klasse

9

Ich sah ein paar verwandte Fragen und Antworten hier, aber sie schienen nicht zu helfen. Ich denke also, ich muss hier eine separate Frage stellen:

Ich habe eine serialisierbare Klasse MyDataClass , die ein paar mehr serialisierbare innere Klassen enthält. Ich speichere es in einer Datei mit FileOutputStream und ObjectOutputStream . Beim Zurücklesen bekomme ich manchmal eine Ausnahme (vielleicht ClassNotFoundException oder InvalidClassException , aber ich bin mir nicht sicher), und die Nachricht der Ausnahme lautet wie folgt:

%Vor%

MyDataClass ist ungefähr so:

%Vor%

Dann habe ich den folgenden Code verwendet, um es zu lesen:

%Vor%

Eine Ausnahme wird von readObject ausgelöst, NICHT JEDES MAL, aber manchmal kann ich sie nicht genau lokalisieren. Ich habe irgendwo gelesen, dass die serialVersionUID, die tatsächlich in die Datei geschrieben wurde, nicht das ist, was ich im Code zugewiesen habe. Wenn es zurückgelesen wird, stimmt die UID nicht überein, und daher die Ausnahme. Ist das richtig? Wenn ja, wie kann ich sicherstellen, dass es keine Ausnahme gibt und das Objekt wie erwartet zurückgelesen wird?

Danke.

BEARBEITEN: Es scheint, dass beim Debuggen von Eclipse alles in Ordnung war. Aber nachdem ich einen Build mit ant erstellt habe, würde das Problem auftauchen. Aber nicht jedes Mal nach einem ant Build, aber manchmal.

BEARBEITEN: Ich habe in einem anderen Beitrag gesehen:

Lesen Sie aus einer Datei? In diesem Fall spielt es keine Rolle, ob Sie die serialVersionUID jetzt hinzugefügt haben, sie unterscheidet sich von der in der Datei gespeicherten und erstellt die Ausnahme. Eine schnelle Lösung könnte sein, serialVersionUID auf 4209360273818925922L zu setzen, was die serialVersionUID zu sein scheint, die automatisch von Java generiert wurde, als Sie das Objekt zu diesem Zeitpunkt in dieser Datei gespeichert haben.

Meine Datei wird oft gespeichert / gelesen, wenn der Benutzer die App benutzt. Wenn Java jedes Mal eine andere UID zuweist , speichert die Datei, wie kann ich dann eine Nummer im Code vorher einbinden? Ich brauche eine wirklich statische UID, die sich auch nach einem ant Build nicht ändert.

    
wwyt 02.12.2011, 05:54
quelle

2 Antworten

2

Ich stimme AKJ zu:

Ich denke, dass für Ihr erstes Problem "Klasse nicht gefunden" - Sie wahrscheinlich die Klasse in einer Umgebung deserialisieren, die diese Klasse nicht kennt. Es ist auch möglich, dass Sie 2 Umgebungen mit 2 Kopien der Klasse haben.

AnyHow, die UID der Serialisierung funktioniert so: Wenn Sie keins angegeben haben, wird es bei jedem Kompilieren / Erstellen automatisch generiert - andernfalls, wenn Sie eines angegeben haben, dann ist dies die UID.

Beachten Sie, dass AJK richtig sein kann, ohne dass Sie es bemerken. - Jedes Klassenmitglied aus Ihrer Klasse wird standardmäßig serialisiert, es sei denn, Sie erklären es als vorübergehend. Also, wenn Sie kurz, lang, String, myClass oder was auch immer haben, werden sie alle durch Serilisation gehen. Gemäß der obigen Erklärung, wenn keine konstante UID gesetzt ist, sollte jedes Mal, wenn Sie ypu kompilieren, eine andere UID bekommen - und dies wird wahrscheinlich Ihr Problem verursachen.

viel Glück.

    
user967710 21.02.2012 23:23
quelle
1

Da Sie die serialVersionUID explizit deklarieren, sollte es kein Problem beim Serialisieren und Deserialisieren geben, solange die serialVersionUID nicht geändert wird (und die Klasse sich nicht drastisch geändert hat).

Aus der Ausnahmebedingungsnachricht geht hervor, dass Sie möglicherweise eine Mitgliedsklasse haben, die ebenfalls serialisiert wird, aber keine explizite serielle Versions-UID hat. Daher müssen Sie möglicherweise auch die serialVersionUID in dieser Klasse explizit deklarieren.

Eine andere Möglichkeit besteht darin, dass Sie versehentlich versuchen, eine Datei zu lesen, die gespeichert wurde, bevor Sie die explizite serialVersionUID eingeben.

    
Ashwinee K Jha 02.12.2011 06:26
quelle

Tags und Links