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 :
Von diesem erbt nun ein anderes Bean namens TrcsProcessConfigBeanConv :
Dieses TrcsProcessConfigBeanConv will ich nun serialisieren und wieder deserialisieren, dazu hab ich mir folgende einfache Main-Methode geschrieben:
Führe ich das aus erhalte ich :
Zeile 36 ist diese
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:
ok, dann hab ich auf die Warnung geklickt und eclipse bietet mir nun als Auswahlmöglichkeit:
Das hab ich dann in beiden bean-Klassen angeklickt, die sehen nun so aus:
und so:
Es ist also jeweils nur ein Feld hinzugekommen.
Führe ich aber nun meine main-Methode aus, kriege ich:
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:
Und in TrcsProcessConfigBeanConv:
in der Fehlermeldung hingegen:
Was soll das? Muss ich das verstehen?
Was kann ich tun?
Danke für alle Tips im Voraus!
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!