Nicht Serialisieren/Deserialisieren ArrayList
Ich versuche zum serialisieren und Deserialisieren eines array-Liste mit einem Objekt innen:
HairBirt param = new HairBirt();
param.setName("name");
param.setValue(2.3f);
HairBirt param2 = new HairBirt();
param2.setName("name2");
param2.setValue(2.4f);
ArrayList<HairBirt> list = new ArrayList<HairBirt>();
list.add(param);
list.add(param2);
ByteArrayOutputStream bos = null;
try {
bos = new ByteArrayOutputStream();
ObjectOutputStream obj_out = new ObjectOutputStream(bos);
obj_out.writeObject(list);
} catch (IOException e) {
e.printStackTrace();
}
String encoded = bos.toString();
try {
encoded = URLEncoder.encode(encoded, "UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
System.out.print("The serialized output is: " + encoded);
//DECODE
ArrayList<HairBirt> paramDecoded;
String myParam = null;
try {
myParam = URLDecoder.decode(encoded, "UTF-8");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
System.out.println("Got parameters");
ByteArrayInputStream bis = new ByteArrayInputStream(myParam.getBytes());
try {
ObjectInputStream obj_in = new ObjectInputStream(bis);
paramDecoded = (ArrayList<HairBirt>) obj_in.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Den HairList-Objekt ist auch ein serialisiertes Objekt.
Diese code-Ausführung ist wieder die folgende Fehlermeldung:
java.io.InvalidClassException: java.util.ArrayList; local class incompatible: stream classdesc serialVersionUID = 8664875232659988799, local class serialVersionUID = 8683452581122892189
in Zeile paramDecoded = (ArrayList<HairBirt>) obj_in.readObject();
Ich weiß nicht, was ich falsch mache. Können Sie einen Tipp geben?
Update:
Gelöst:
Nur verwendet ein natives array von HairBirt statt einer ArrayList und es funktioniert:
HairBirt[] list = new HairBirt[x];
statt
ArrayList<HairBirt> list = new ArrayList<HairBirt>();
Danke Euch allen für Eure Hilfe.
InformationsquelleAutor sakana | 2009-03-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht verwenden
ByteArrayOutputStream.toString()
- verwenden Sie stattdessentoByteArray()
- und base64-Codierung, die binäre Daten konvertiert es in einen string, ohne Informationen zu verlieren.Ich vermute stark, dass ist das Hauptproblem -, dass Sie verlieren die Daten nach der Serialisierung. Sollte man wohl auch schließen, oder zumindest Spülen Sie die
ObjectOutputStream
. Ich weiß nicht, offhand ob das tatsächlich alles tut, in diesem Fall, aber es scheint eine gute Idee zu sein.Ich glaube nicht, dass es keine base64-Unterstützung direkt in Java (in einer öffentlichen Klasse, sowieso), aber es gibt verschiedene 3rd-party-Bibliotheken, die Sie verwenden können, wie der in der Apache-Commons-Codec-Bibliothek.
Was meinst du mit 'auf, die sich bewegen'? Sie wird zu konvertieren, BAOS, um eine Zeichenfolge in einer verlustfreien Weise, wenn Sie wollen in der Lage sein, zu Deserialisieren. Ob das mit base64 oder nicht, ist eine andere Frage, aber ich denke, es ist ein guter Weg, es zu tun.
base64 ist ein format-string mit einem begrenzten Zeichensatz.
Was meinst du mit 'auf, die sich bewegen'? Ich meine, dass ich wirklich brauchen, um verwenden Sie eine Zeichenfolge zwischen die Codierung und Decodierung von code. Es ist der einzige parameter, den Typ ich bin in der Lage, zu verwenden.
Das ist in Ordnung - das ist, warum Sie verwenden Sie base64 zu konvertieren von byte[] zu String, ohne Informationen zu verlieren.
InformationsquelleAutor Jon Skeet
Haben Sie versucht, überschreiben dieses Verhalten durch die Erklärung Ihrer eigenen serialVersionUID in einer benutzerdefinierten Klasse?
Haben Sie einen bestimmten Grund für das tun der zusätzliche Schritt der Serialisierung durch einen string? Normalerweise würden Sie nur Deserialisieren über einen ObjectOutputStream.
InformationsquelleAutor Steve B.