Object nach Deserialisierung nicht mehr gleich

woezelmann

Mitglied
Hallo Leute,

ich hab folgendes Problem: Hab ne ziemlich komplizierten Map, die ungefähr so aussieht:
Code:
Map<String, Map<String, EcmObject>>
EcmObject enthält wiederrum einige Strings, ints und enums und eine Liste von anderen 'custom' Objecten.
Alles was ich so benutze implementiert Serializable und ich hab auch alle hashCode und equals Methoden überschrieben.

Wenn ich jetzt zwei unterschiedliche Instanzen dieses Konstrukts erstelle, die die gleichen Werte haben und sie mit equals() vergleiche, krieg ich ein TRUE zurück. Wenn ich jetzt aber ein Instanz auf die Palatte serialisiere und dann wieder deserialisiere, krieg ich plötzlich FALSE.

Jetzt stellt sich mir die Frage: wieso?

Irgendwelche Ideen?

Im voraus besten Dank!
 

Atze

Top Contributor
haben alle klassen ne explizite serialVersionUID? ist nur ne vermutung, weiß nicht obs daran liegen könnte.

"If a serializable class does not explicitly declare a serialVersionUID, then the serialization runtime will calculate a default serialVersionUID value for that class based on various aspects of the class, as described in the Java(TM) Object Serialization Specification."

Quelle: Serializable (Java 2 Platform SE 5.0)

vielleicht kommt er da durcheinander, falls das beim equals mit einbezogen wird. irgendwei, keine ahnung ob das der knackpunkt sein könnte.
 

fastjack

Top Contributor
Normalerweise müßtest Du dann eine SerializationException bekommen, wegen verschiedener SUIDs. Ich schätze mal das False kommt aus einem späteren equals ? Ein Problem kann natürlich sein, daß bei handgesetzer (und nicht ordentlich gepflegter) SUID Probleme entstehen, weil die abgespeicherten Daten verändert sind. (Beispiel: auf wenn auf immer und ewig 1L benutzt wird)
 
Zuletzt bearbeitet:

woezelmann

Mitglied
@SlaterB

bin mir nicht ganz sicher ob ich dich verstehe, was meinst du. EcmObject auf 20 Zeilen zusammenkürzen?
Hab es mal mit der Deep-Copy versucht, das geklonte Object ist wieder NICHT equal!
 
S

SlaterB

Gast
na mein erster Satz ist doch 'vollständiges TestProgramm', also hier posten,
und da ist es dann wenig hilfreich wenn die Klasse EcmObject unbekannt bleibt oder 300 Zeilen lang ist und auf 5 weitere unbekannte Klassen verweist,

verwende eine möglichst kurze Dummy-Klasse, vielleicht nur mit einem Attribut,
wenn dann der Test gelingt, dann eben nach und nach mehr vom Ursprungscode einfügen,
auf diese Weise kannst du den Fehler übrigens auch ganz gut selber finden

eine andere Strategie ohne hier was zu posten wäre, sich die Objekte genauer anzuschauen!
nur equals == false ist ja nicht der Weisheit letzter Schluss, schaue dir die Anzahl der Objekte in jeder Map an, vergleiche diese einzeln bis auf die letzten String- und int-Variablen runter

ist es überhaupt normal, dass die Objekte gleich sind? auf zwei identische trifft es sicher zu,
aber wenn du in deinem Programm zweimal auf gleiche Weise das Objekt erzeugst, ist dann vielleicht equals auch schon false?

Map m1 = buildUpNewMapWithManyObjects();
Map m2 = buildUpNewMapWithManyObjects();
m1.equals(m2)

jede beteiligte Klasse mit nicht-überschriebener equals-Methode, unsortierter Liste, Zufallsgenerator im Konstruktor oder wer weiß was alles kann zu Unterschieden führen,
ein Objekt mit sich selber zu vergleichen bringt gar nix, das sollte IMMER true sein,
für eine exakte Kopie muss das nicht gelten

edit:
> Wenn ich jetzt zwei unterschiedliche Instanzen dieses Konstrukts erstelle,
ok..
 
Zuletzt bearbeitet von einem Moderator:
J

JohannisderKaeufer

Gast
Serialisiere und Deserialisiere doch mal beide Objekte, und vergleiche sie danach miteinander!

Bin gespannt was da rauskommt.

Und Serialisiere ein Objekt zwei mal und vergleiche es dann mit einem einmal serialisierten Objekt.

Mit etwas Logik läßt sich dann vielleicht der ein oder andere Schluß ziehen
 

woezelmann

Mitglied
Da bin ich wieder, hatte gestern keinen Nerv mehr, mich damit auseinanderzusetzen.

Hab jetzt bei einem Beispiel rausgefunden, worin sich die Instanzen unterscheiden. Zum besseren Verständnis hier eine kurze (@SlaterB: nicht mehr als 20 Zeilen lange, jetzt hab ichs geschnallt ;) ) Zusammenfassung meiner Klassen:

Code:
public class EcmObject implements Comparable, Serializable {
    private EcmObjectType type;
    private String name;
    private List<EcmField> fields;
    private boolean pages;

    // getter, setter, equals, hashCode
}

Code:
public enum EcmObjectType implements Serializable {
    FOLDER, REGISTER, DOCUMENT
}

Code:
public class EcmField implements Comparable, Serializable {
    private EcmFieldDataType dataType;
    private EcmFieldControlType controlType;
    private String name;
    private String dbname;
    private String internalname;
    private Integer length;

    // getter, setter, equals, hashCode
}

Code:
public enum EcmFieldControlType implements Serializable{
    DEFAULT, CHECKBOX, LIST, DBLIST, TEXTAREA, HIERARCHY, TREE, GRID, RADIO, PAGECONTROL, STATIC;
}

Code:
public enum EcmFieldDataType implements Serializable {
    TEXT, DATE, NUMBER, GROUP, DEC;
}

Beim serialisieren verschwindet in meinem Beispiel aus im EcmObject aus der List<EcmField> fields (is ne LinkedList) ein Eintrag (an vorletzer Stelle; vor dem Serialisieren hat die Liste 31 Einträge, danach nur 30).

Das EcmField das verschwindet, sieht so aus:

Code:
EcmFieldDataType dataType = TEXT
EcmFieldControlType controlType = STATIC
String name = "Tätigkeiten exportieren"
String dbname = ""
String internalname = "B_TEXP"
Integer length -1

Dachte zuerst es könnte an dem Umlaut bei "Tätigkeiten exportieren" liegen, aber andere Einträge mit Umlauten werden scheinbar serialisiert.

Irgendwelche Ideen?
 
S

SlaterB

Gast
und wenn vorher nur 30 drin sind, sind es danach immer noch 30 oder 29?
wie sieht es bei 20, 10, vielleicht nur 2 oder 1 Objekten aus?

es fehlt immer noch die main-Methode für Copy, Paste, Run -> Fehler

ich könnte jetzt ein Testprogramm zusammenbasteln mit 30 beliebigen Einträgen und als 31. dann ungefähr den angegebenen,
aber ich glaube nicht daran dass es schiefgeht, daher spare ich mir doch die Mühe ;)
 

woezelmann

Mitglied
Yeah, ich hab rausgefunden, woran es lag... Festhalten:

Was ich nicht erwähnt habe (erschien mir unwichtig) ist, dass ich beim Serialisieren in einem Schlag in die selbe Datei noch eine ListOrderedMap<String, Mapping> schreibe (ListOrderedMap ist so ein Konstrukt von Commons Collection).

Die Mapping Klasse sieht so aus:

Code:
public class Mapping implements Serializable {
    private EcmObjectType type;
    private String fromName = "";
    private String toName = "";
    private Map<String, String> fields = new ListOrderedMap<String, String>();
}

Wobei der EcmObjectType der gleiche enum ist, denn ich auch bei EcmObject benutze.

Wenn diese ListOrderedMap<String, Mapping> leer ist, dann ist equals auch equals. Sobald die ListOrderedMap<String, Mapping> Einträge hat, geht was schief.

Ich versteh zwar nicht wirklich, wieso, aber immerhin weiß ich jetzt was ich ändern muss... :D
 
S

SlaterB

Gast
> dass ich beim Serialisieren in einem Schlag in die selbe Datei

das passt ja kaum zur oben von mir erwähnten clone-Methode statt normaler Serialisierung ;)


ganz schön gefährlich jetzt einfach so weiterzumachen wenn es in einer bestimmten Situation klappt..
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Object nach Vererbung mit Class Object überprüfen Allgemeine Java-Themen 4
C casten vom Typ Object nach Double[][] Allgemeine Java-Themen 2
U eigene Datenstruktur ArrayList<String> nach Object [][ Allgemeine Java-Themen 2
T HashMap (String, Object(String , int)) nach int sortieren Allgemeine Java-Themen 7
S Object nach Integer umwandeln Allgemeine Java-Themen 13
K Object nach Vector konvertieren Allgemeine Java-Themen 3
H Object cast exception Allgemeine Java-Themen 6
P JDK nicht installiert in Net Object Fusion Allgemeine Java-Themen 7
Erwin82a Object cannot be converted to Custom Class in Lampda Expression Allgemeine Java-Themen 2
Zeppi Cast Object in Generics Allgemeine Java-Themen 4
MoxxiManagarm Mapping into existing object Allgemeine Java-Themen 15
coolian Swing erstellt fillreckt immmer ein neues object Allgemeine Java-Themen 13
N Wo ist Object.class ? Allgemeine Java-Themen 0
R Erste Schritte Object reference funktioniert nicht. Wie mach ichs richtig? Allgemeine Java-Themen 3
RalleYTN Datentypen Herausfinden ob Object ein Array ist ohne den Typen des Arrays zu kennen? Allgemeine Java-Themen 12
N Gibt es etwas allgemeineres as Object? Allgemeine Java-Themen 16
Bananabert Swing jtree : image als user object Allgemeine Java-Themen 2
N ArrayList in eigenem Object nicht richtig serialisierbar Allgemeine Java-Themen 14
B [Android] EditText-Object ist null - Nimmt nicht den Wert des enthaltenen Textfeldes ein Allgemeine Java-Themen 2
Z Vergleich zwischen int und Object Allgemeine Java-Themen 1
T InvalidClassException - Read null attempting to read class descriptor for object Allgemeine Java-Themen 8
J Ist eine Instanz von einem bestimmten Object Typ? Allgemeine Java-Themen 6
L Sortieren von "Map<String, Object>" Allgemeine Java-Themen 2
M Cast double[]-->Object[] oder Vector<double[]> Allgemeine Java-Themen 3
G REST- Object darstellung Allgemeine Java-Themen 6
C Object.equals() liefert falschen Wert? Allgemeine Java-Themen 14
darekkay Generics: Wildcard und Object Allgemeine Java-Themen 5
O Socket Object wird scheinbar falsch empfangen Allgemeine Java-Themen 6
N Klasse/Object Eigenaufruf Allgemeine Java-Themen 5
G JNI Shared Object Allgemeine Java-Themen 10
B Variable class in java.lang.Object Allgemeine Java-Themen 11
S Klassen Zuorgnung Object-char Allgemeine Java-Themen 2
N java.lang.IllegalMonitorStateException: object not locked by thread before notify() Allgemeine Java-Themen 2
S Type mismatch: cannot convert from Object to float Allgemeine Java-Themen 3
A Input/Output Serialisierung und Object.hashCode() Allgemeine Java-Themen 3
M Jaxb und JPA: A cycle is detected in the object graph Allgemeine Java-Themen 5
H double dispatch und equals(Object) Allgemeine Java-Themen 6
J Datentypen Problem mit Date-Object Allgemeine Java-Themen 2
B Variablen Alle RenderingHints.Keys (KEY_*) in Array + alle RenderingHints.Keys (VALUE_*) in Object[] Allgemeine Java-Themen 8
J Verschiedene Klassen als "Object" in ArrayList und dann in for-Schleife erzeugen!? Allgemeine Java-Themen 2
L Object Instanz anhand eines Strings Allgemeine Java-Themen 10
A Datei als Object einlesen und das Object als Singleton instance setzen. Allgemeine Java-Themen 13
DEvent embedded Object Database in Text Format Allgemeine Java-Themen 5
J Casting Problem Object, Double und String Allgemeine Java-Themen 3
M Object-Instanz in Date übersetzen Allgemeine Java-Themen 6
P Tree Object structure Allgemeine Java-Themen 19
G Object mit clone kopieren Allgemeine Java-Themen 21
J merkwürdig: Object Allgemeine Java-Themen 6
Iron Monkey Object in Datei effizienter lesen / schreiben Allgemeine Java-Themen 13
L Object = null? Allgemeine Java-Themen 16
dayaftereh Serializable und Object In/Out Stream Allgemeine Java-Themen 2
T Object auf Double, Int, String testen Allgemeine Java-Themen 5
N serialize deserialize java object über string Allgemeine Java-Themen 8
N getName() of reflection Object Allgemeine Java-Themen 4
B Probelm mit File Object Allgemeine Java-Themen 6
G NoClassDefFoundError: java/lang/Object Allgemeine Java-Themen 4
S Liste Object Löschen Allgemeine Java-Themen 7
P not enough space for object heap - Trotz mehr RAM? Allgemeine Java-Themen 6
MQue List<String> aus List<Object> generieren Allgemeine Java-Themen 2
M ArrayList<Object[]> und toArray() Allgemeine Java-Themen 5
Daniel_L LinkedList vom Typ Object-Array? Allgemeine Java-Themen 4
B Warum return type Object ? Allgemeine Java-Themen 4
D Generisches Object erstellen Allgemeine Java-Themen 2
M Databinding von Object zu properties-Datei Allgemeine Java-Themen 10
P Wieso HashMap-Zugriff mit Object, statt mit MyObject? Allgemeine Java-Themen 12
A NullPointer bei konvertierung von byteArr --> Object Allgemeine Java-Themen 3
foobar Object to byte[] ohne Serializable Allgemeine Java-Themen 6
reibi Object clonen spezial Allgemeine Java-Themen 8
X cannot convert from Object[] to Integer[] Allgemeine Java-Themen 2
G JSON Object auslesen Allgemeine Java-Themen 1
T cast Object to Double[] Allgemeine Java-Themen 2
G Object. Wrapper Allgemeine Java-Themen 12
V Object durchsuchen Allgemeine Java-Themen 4
T "Object o = new Object()" vs. "new Object()&q Allgemeine Java-Themen 8
T Object -> byte[] Allgemeine Java-Themen 5
M Implementation von Zugriffen auf Object[index] in der JVM Allgemeine Java-Themen 9
T Klasse => Primitiv ? Object instanceof Klasse Allgemeine Java-Themen 2
B mit methode ein object zurückgeben. Allgemeine Java-Themen 5
R Object Dynamisch erzeugen (Reflection API) Allgemeine Java-Themen 22
P Typ Object in socket umwandeln Allgemeine Java-Themen 4
G Object cast via Reflection Allgemeine Java-Themen 8
Zed JList Object einfügen und Text anzeigen Allgemeine Java-Themen 3
MQue Object in Integer umwandeln Allgemeine Java-Themen 3
G Error: Hashtable Type safety: The method put(Object, Object) Allgemeine Java-Themen 6
T double to object Allgemeine Java-Themen 3
S File Object zu Directory machen ? Allgemeine Java-Themen 9
V Brauche dringend Hilfe. Object-handling Allgemeine Java-Themen 4
N Warning "The Cast from Object to" Allgemeine Java-Themen 9
K Threads und ein übergeordnetes Object Allgemeine Java-Themen 7
F Zugriff mittels getObject() oder this.object ? Allgemeine Java-Themen 8
W Object -> isPrimitiv? Allgemeine Java-Themen 7
D Cast schlägt fehl : Object[] zu Button[] Allgemeine Java-Themen 2
R object zu array casten. Allgemeine Java-Themen 2
N Map Object Allgemeine Java-Themen 13
G Eine C/C++ Referenz in einem Java Object speichern Allgemeine Java-Themen 5
N Ermitteln welchen Typ ein "Object"-Objekt enthält Allgemeine Java-Themen 11
K Cast ohne neues Object zu erzeugen Allgemeine Java-Themen 12
D Object in int casten Allgemeine Java-Themen 7
N Object-Array mit Comparator absteigend sortieren? Allgemeine Java-Themen 10
D Object to Long casting Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben