import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
public class Auto implements Serializable {
String farbe;
int reifen;
int tueren;
public Auto(String farbe, int reifen, int tueren) {
this.farbe = farbe;
this.reifen = reifen;
this.tueren = tueren;
}
public static void main(String[] args) {
try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream("MeineObjekte.obj"));
try {
Auto auto = (Auto) in.readObject();
System.out.println(auto.getFarbe());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public String getFarbe() {
return farbe;
}
public void setFarbe(String farbe) {
this.farbe = farbe;
}
public int getReifen() {
return reifen;
}
public void setReifen(int reifen) {
this.reifen = reifen;
}
public int getTueren() {
return tueren;
}
public void setTueren(int tueren) {
this.tueren = tueren;
}
}
java.io.InvalidClassException: Auto; local class incompatible: stream classdesc serialVersionUID = 7796366684207450100, local class serialVersionUID = -210223322502546621
at java.ibjectStreamClass.initNonProxy(Unknown Source)
at java.ibjectInputStream.readNonProxyDesc(Unknown Source)
at java.ibjectInputStream.readClassDesc(Unknown Source)
at java.ibjectInputStream.readOrdinaryObject(Unknown Source)
at java.ibjectInputStream.readObject0(Unknown Source)
at java.ibjectInputStream.readObject(Unknown Source)
at Auto.main(Auto.java:28)
Ich verstehe nicht was ich falsch gemacht habe... die datei existiert im übrigen.
Der Ansatz ist richtig... aber wenn du Objekte (inkompatibel) änderst, wird es schwer diese zu vermischen. Wenn du sie kompatibel änderst, dann musst du die svUID implementieren (gleich natürlich) und für Kompatibilität sorgen. Unter Umständen muss man dazu die Methoden readObject und writeObject überschreiben.
Alternativ kann man auch andere Arten der Serialisierung einsetzen, z.B. XML... aber das Problem an sich (alte und neue Version des Objekts) bleibt dabei gleich...
Externalizable ist auch ganz praktisch, da musst du die methoden überschreiben und es bringt auch einiges an speed
für Objekte die null sind kannst du z.B. n Boolean / Byte schreiben
Code:
class Polygon implements Externalizable {
Point first;
public void writeExternal( ObjectOutput out ) throws IOException {
if ( first == null )
out.writeByte(0);
else
out.writeByte(1);
Point next = first;
while ( next != null ) {
out.writeObject(next);
next = next.next;
}
}
public void readExternal( ObjectInput in ) throws IOException,
ClassNotFoundException {
byte b = in.readByte();
if ( b == 0 ) {
first = null;
return;
}
// Einlesen der serialisierten Punkte
Point next;
first = (Point) in.readObject();
}
}