bean + serialisierung + serialVersionUID

Status
Nicht offen für weitere Antworten.

jollyroger

Bekanntes Mitglied
Liebe Leute,

ich hab seit Stunden ein Problem welches mich in den Wahnsinn treibt und hoffe ihr könnt mir helfen....

Folgendes:

Ich hab folgendes Bean namens TrcsProcessConfigBean :

Code:
public class TrcsProcessConfigBean implements Serializable{
 
	protected String procName;
	protected String oStackName;
	protected String oStackNodeName;
	
	public String getOStackName() {
		return oStackName;
	}
	public String getProcName() {
		return procName;
	}
	public String getOStackNodeName() {
		return oStackNodeName;
	}
	
	public TrcsProcessConfigBean(String procName, String oStackName, String oStackNodeName) {
		this.procName = procName;
		this.oStackName = oStackName;
		this.oStackNodeName = oStackNodeName;
	}
}

Von diesem erbt nun ein anderes Bean namens TrcsProcessConfigBeanConv :

Code:
public class TrcsProcessConfigBeanConv  extends TrcsProcessConfigBean implements Serializable {

	private String iStackName;
	private String iStackNodeName;

	public String getIStackNodeName() {
		return iStackNodeName;
	}

	public String getIStackName() {
		return iStackName;
	}
	
	public TrcsProcessConfigBeanConv(String procName, String oStackName, String oStackNodeName, String iStackName, String iStackNodeName ) {
		super(procName, oStackName, oStackNodeName);
		this.iStackName = iStackName;
		this.iStackNodeName = iStackNodeName;
	}
}

Dieses TrcsProcessConfigBeanConv will ich nun serialisieren und wieder deserialisieren, dazu hab ich mir folgende einfache Main-Methode geschrieben:



Code:
public class TestSerializingCfgBean {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		TrcsProcessConfigBeanConv cfgBean = new TrcsProcessConfigBeanConv("behemoth_process","output_stack_30","foo", "bar", "foobar");
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		try {

// serialize
			ObjectOutputStream oos = new ObjectOutputStream(baos);
			oos.writeObject(cfgBean);
			oos.flush();
			oos.close();

			String s = new String(baos.toString());
			System.out.println("TrcsProcessConfigBean serialized into a string: "+ s);

// deserialize

			ByteArrayInputStream bais = new ByteArrayInputStream(s.getBytes());
			ObjectInputStream ois = new ObjectInputStream(bais);
			TrcsProcessConfigBeanConv cfgBean2 = (TrcsProcessConfigBeanConv) ois.readObject();
			ois.close();

		
		} catch (IOException e) {
			System.out.println("IO Exception:" + e.getMessage());
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			System.out.println("ClassNotFound Exception:" + e.getMessage());
			e.printStackTrace();
		}
	}
}

Führe ich das aus erhalte ich :

Code:
IO Exception:de.trcsystem.process.TrcsProcessConfigBean; local class incompatible: stream classdesc serialVersionUID = 2718507660599967685, local class serialVersionUID = 2718507660599991749
java.io.InvalidClassException: de.trcsystem.process.TrcsProcessConfigBean; local class incompatible: stream classdesc serialVersionUID = 2718507660599967685, local class serialVersionUID = 2718507660599991749
	at java.io.ObjectStreamClass.initNonProxy(Unknown Source)
	at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
	at java.io.ObjectInputStream.readClassDesc(Unknown Source)
	at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
	at java.io.ObjectInputStream.readClassDesc(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	at de.trcsystem.testing.TestSerializingCfgBean.main(TestSerializingCfgBean.java:36)

Zeile 36 ist diese

Code:
TrcsProcessConfigBeanConv cfgBean2 = (TrcsProcessConfigBeanConv) ois.readObject();

Zeile der Main-Methode, also am Ende der Deserialisierung.

So, das verstehe ich schon mal nicht, ich setzte ja in den beans keine serialVersionUID.
Aber eclipse zeigt mir das als Warning bei den Bean-Klassen an:

Code:
The serializable class TrcsProcessConfigBean does not declare a static final serialVersionUID field of type long

ok, dann hab ich auf die Warnung geklickt und eclipse bietet mir nun als Auswahlmöglichkeit:

Code:
Add generated serial version ID

Das hab ich dann in beiden bean-Klassen angeklickt, die sehen nun so aus:

Code:
public class TrcsProcessConfigBean implements Serializable{
 

	private static final long serialVersionUID = -5590868576506217927L;
	
	protected String procName;
	protected String oStackName;
	protected String oStackNodeName;
	
	public String getOStackName() {
		return oStackName;
	}
	public String getProcName() {
		return procName;
	}
	public String getOStackNodeName() {
		return oStackNodeName;
	}
	
	public TrcsProcessConfigBean(String procName, String oStackName, String oStackNodeName) {
		this.procName = procName;
		this.oStackName = oStackName;
		this.oStackNodeName = oStackNodeName;
	}
}

und so:

Code:
public class TrcsProcessConfigBeanConv  extends TrcsProcessConfigBean implements Serializable {

	private static final long serialVersionUID = 2718507660599991749L;

	private String iStackName;
	private String iStackNodeName;

	public String getIStackNodeName() {
		return iStackNodeName;
	}

	public String getIStackName() {
		return iStackName;
	}
	
	public TrcsProcessConfigBeanConv(String procName, String oStackName, String oStackNodeName, String iStackName, String iStackNodeName ) {
		super(procName, oStackName, oStackNodeName);
		this.iStackName = iStackName;
		this.iStackNodeName = iStackNodeName;
	}
}

Es ist also jeweils nur ein Feld hinzugekommen.

Führe ich aber nun meine main-Methode aus, kriege ich:

Code:
IO Exception:de.trcsystem.process.conv.TrcsProcessConfigBeanConv; local class incompatible: stream classdesc serialVersionUID = 2718507660599967685, local class serialVersionUID = 2718507660599991749
java.io.InvalidClassException: de.trcsystem.process.conv.TrcsProcessConfigBeanConv; local class incompatible: stream classdesc serialVersionUID = 2718507660599967685, local class serialVersionUID = 2718507660599991749
	at java.io.ObjectStreamClass.initNonProxy(Unknown Source)
	at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
	at java.io.ObjectInputStream.readClassDesc(Unknown Source)
	at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	at de.trcsystem.testing.TestSerializingCfgBean.main(TestSerializingCfgBean.java:36)

Also genau die gleiche Fehlermeldung wie vorher....
Was ich auch nicht verstehe ist, das die in der Fehlermeldungen genannten serialVersionUID nicht mit dem übereinstimmen was in meinen Klassen steht:

in TrcsProcessConfigBean steht:

Code:
private static final long serialVersionUID = -5590868576506217927L;

Und in TrcsProcessConfigBeanConv:

Code:
private static final long serialVersionUID = 2718507660599991749L;

in der Fehlermeldung hingegen:

Code:
tream classdesc serialVersionUID = 2718507660599967685, local class serialVersionUID = 2718507660599991749

Was soll das? Muss ich das verstehen?
Was kann ich tun?

Danke für alle Tips im Voraus!
 
S

SlaterB

Gast
das muss was mit den ganzen Umwandlungen zu tun haben,
da wird die Versions-ID irgendwann verfälscht,
z.B. abhängig davon ob ein byte oder long mit Vorzeichen oder ohne Vorzeichen interpretiert wird,
oder sowas in der Art ;)

mit kleinen VersionsIds wie 1,2,3, < 10 Stellen scheint es problemlos zu funktionieren

ebenfalls zu funktionieren 'scheint' es bei mir bei Angabe eines Encoding/ CharSets:

String s = new String(baos.toString("ISO-8859-1"));
ByteArrayInputStream bais = new ByteArrayInputStream(s.getBytes("ISO-8859-1"));

aber sieh das höchstens als 'Probieren bis es mal zufällig geht' an,
keine Garantie ;)
 

jollyroger

Bekanntes Mitglied
Also erst mal ein dickes Dankeschön an SlaterB!

Es funktioniert jetzt nachdem ich die ID selber vergeben habe, also sowas wie "111", "222" usw....

Aber eine Frage noch:

Ist das nun ein Bug in Java oder in Eclipse?

Ich hab bezüglich eclipse gegoogelt nach "eclipse bug serialization suid" und dazu auch einiges gefunden, aber nichts was irgendwie genau dieses Problem beschreibt.

Sollte man einen bugreport schreiben? Oder ist das schon passiert? Oder übersehe ich was?
 
S

SlaterB

Gast
wie ich bereits geschrieben habe (kann man das nicht rauslesen?)
würde ich den Fehler eher bei dir ansiedeln,

Object, byte[], String, byte[], Object
ist nun mal nicht ganz trivial, sicherlich auch abhängig vom lokalen Betriebssystem, Spracheinstellungen,
was weiß ich nicht alles

ich stimme dir zu, dass dein Code 'eigentlich' ganz normal aussieht und eine korrekt Ausführung auch ohne Angabe von 'ISO-8859-1' wüschenswert ist,

was nun dafür oder dagegen spricht/ woher der Fehler eigentlich genau kommt wage ich aber nicht zu beurteilen, du sicher noch weniger,
Bugs anlegen würde ich also den Profis überlassen, die bei solch allgemeinen Code sicherlich schon vorbeigekommen sind,

gegen Nachfragen auch in Bugreport-Foren (falls es die gibt) spricht natürlich nix


---------

versuchs doch mal ohne Eclipse,
mit Komandozeile javac/ java, dann sieht du ob es was mit Eclipse zu tun hat (falls es ohne Eclipse klappt),

würde mich stark überraschen, aber habe dennoch keine Lust, es selber zu testen ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Abbruch einer ViewScoped Bean in Arbeit Allgemeine Java-Themen 2
bueseb84 required a bean of type that could not be found. Allgemeine Java-Themen 2
D Bean Zustandsänderung registrieren Allgemeine Java-Themen 2
E Die if-Anweisung in einer Java Bean bzw. in einem Servlet? Allgemeine Java-Themen 8
D JSF Bean Attribute bei Seitenaufruf Allgemeine Java-Themen 6
T Bean & xhtml Allgemeine Java-Themen 10
B Daten aus Bean holen Allgemeine Java-Themen 5
R boolean im Bean abfragen Allgemeine Java-Themen 18
A Standalone geht - JSP u. Bean nicht Allgemeine Java-Themen 6
M Acrobat Viewer Bean - EULA-Anzeige verhindern Allgemeine Java-Themen 4
M Problem bei PDF-Anzeige mittels Acrobat Viewer Bean Allgemeine Java-Themen 2
J die Bean oder das Bean Allgemeine Java-Themen 13
L Java Bean Allgemeine Java-Themen 8
H JSF - Wert an ein managed bean übergeben Allgemeine Java-Themen 2
M Bean Listener hinzufügen und Methode später überschreiben Allgemeine Java-Themen 27
antonia09 Einkaufszettel Persistenz und Serialisierung Allgemeine Java-Themen 6
D Serialisierung und Deserialisierung von Objekten - Frageprogramm Allgemeine Java-Themen 4
R Datentypen Korrekte integer in Hex ASCII Konvertierung und serialisierung Allgemeine Java-Themen 1
M Serialisierung funktioniert nicht Allgemeine Java-Themen 9
Z Best Practice Serialisierung Allgemeine Java-Themen 2
Arif Input/Output Serialisierung - Datei wird nicht erzeugt Allgemeine Java-Themen 3
M Alternative zur Serialisierung.. Protobuf? Allgemeine Java-Themen 9
E Serialisierung - Deserialisierung Allgemeine Java-Themen 4
Thallius Serialisierung schlägt fehl. Allgemeine Java-Themen 3
M Serialisierung & Verschlüsselung Allgemeine Java-Themen 2
E Serialisierung - Sinn einer generierten serialVersionUID? Allgemeine Java-Themen 4
V Serialisierung von Instanz eigener Klasse Allgemeine Java-Themen 5
A Input/Output Serialisierung und Object.hashCode() Allgemeine Java-Themen 3
K Serialisierung einer verschachtelten Datenstuktur Allgemeine Java-Themen 9
Tobse Input/Output Dateiformat: Serialisierung VS Custom format Allgemeine Java-Themen 6
A Problem bei Serialisierung von Bibliotheks-Klassen Allgemeine Java-Themen 6
A Input/Output Serialisierung Sonderzeichen Allgemeine Java-Themen 3
P Serialisierung der Oberklasse Allgemeine Java-Themen 2
Kr0e Circular reference - Serialisierung Allgemeine Java-Themen 6
K Serialisierung in Properties-Datei möglich? Allgemeine Java-Themen 3
B Serialisierung mit Unterobjekten über Netzwerk Allgemeine Java-Themen 3
C Serialisierung - Standardwert für nachträglich hinzugefügtes Feld Allgemeine Java-Themen 2
S Serialisierung der Kindklasse Allgemeine Java-Themen 5
K Serialisierung komplett selbst machen Allgemeine Java-Themen 13
C Serialisierung ohne Serializable Allgemeine Java-Themen 4
S Serialisierung und Referenzen Allgemeine Java-Themen 6
S Viele Bilder -> Speicher ausgelastet? / (De-)serialisierung geht nicht mehr richtig Allgemeine Java-Themen 8
E Objekt bei Serialisierung ändern Allgemeine Java-Themen 2
Q Serialisierung / Speicherung Geschwindingkeit & Aktuelle Position Allgemeine Java-Themen 7
Z Serialisierung und Deserialisierung einer HashMap Allgemeine Java-Themen 17
W Serialisierung Allgemeine Java-Themen 6
K Serialisierung von Hashmap in Vector Allgemeine Java-Themen 3
F Serialisierung und Obfuscation? Allgemeine Java-Themen 7
G (De)serialisierung und Referenzen Allgemeine Java-Themen 5
T Serialisierung: Wie macht RMI das so schnell? Allgemeine Java-Themen 14
J Serialisierung: readInt + writeInt Allgemeine Java-Themen 4
X Einige Fragen zu Serialisierung Allgemeine Java-Themen 2
K Serialisierung Allgemeine Java-Themen 6
thE_29 Wie funktioniert Serialisierung? Allgemeine Java-Themen 10
S Problem mit Serialisierung Allgemeine Java-Themen 2
C Serialisierung von JComboBox Allgemeine Java-Themen 4
I serialVersionUID - explizit vergeben oder nicht? Allgemeine Java-Themen 6
reibi serialVersionUID Allgemeine Java-Themen 13
R serialVersionUID Allgemeine Java-Themen 3
W serialVersionUID mit EMF Allgemeine Java-Themen 5
J Probleme wenn man keine serialVersionUID definiert? Allgemeine Java-Themen 27
reibi Eigene exception mit feld "serialVersionUID" Allgemeine Java-Themen 3
M Was ist diese serialVersionUID in Java 5? Allgemeine Java-Themen 8
O does not declare a static final serialVersionUID field of . Allgemeine Java-Themen 6
C SerialVersionUID Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben