2009-03-24 7 views
5

Ich versuche, innerhalb einer Array-Liste mit einem Objekt zu serialisieren und deserialisieren:kann nicht serialisiert/Deserialize Arraylist

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(); 
} 

Die HairList Objekt ist auch ein serialisierbares Objekt.

Diese Codeausführung kehrt den folgenden Fehler:

java.io.InvalidClassException: java.util.ArrayList; local class incompatible: stream classdesc serialVersionUID = 8664875232659988799, local class serialVersionUID = 8683452581122892189

in Linie paramDecoded = (ArrayList<HairBirt>) obj_in.readObject();

Ich weiß nicht, was ich falsch mache. Kannst du einen Tipp geben?

Update:

Entschlossen: verwendet nur eine native Array von HairBirt statt einer Arraylist und es funktioniert:

HairBirt[] list = new HairBirt[x]; 

statt

ArrayList<HairBirt> list = new ArrayList<HairBirt>(); 

Vielen Dank für Eure Hilfe.

Antwort

9

Verwenden Sie nicht ByteArrayOutputStream.toString() - verwenden Sie stattdessen toByteArray() und base64-codieren Sie diese Binärdaten, um sie in eine Zeichenfolge zu konvertieren, ohne Informationen zu verlieren.

Ich vermute stark, dass das das Hauptproblem ist - dass Sie die Daten nach der Serialisierung verloren haben. Sie sollten auch die ObjectOutputStream schließen oder zumindest spülen. Ich weiß nicht, ob das in diesem Fall tatsächlich etwas bewirkt, aber es scheint mir eine gute Idee zu sein.

Ich glaube nicht, dass es Base64-Unterstützung direkt in Java (in einer öffentlichen Klasse, sowieso) gibt, aber es gibt verschiedene 3rd-Party-Bibliotheken, die Sie verwenden können, wie the one in the Apache Commons Codec library.

+0

Yup, das ist das Problem, aber ich brauche wirklich String in diesem Zug ... Das ist nicht das eigentliche Problem, es ist eine Vereinfachung davon. – sakana

+0

Was meinst du mit 'in diesem Zug'? Sie * müssen * das BAOS verlustfrei in einen String konvertieren, wenn Sie es deserialisieren wollen. Ob das mit Base64 ist oder nicht, ist eine andere Sache, aber ich denke, es ist ein guter Weg, es zu tun. –

+0

@sakana: base64 ist ein Zeichenfolgenformat mit einem begrenzten Zeichensatz. – Powerlord

0

Haben Sie versucht, dieses Verhalten zu überschreiben, indem Sie Ihre eigene serialVersionUID in Ihrer benutzerdefinierten Klasse deklarieren?

Haben Sie einen bestimmten Grund für den zusätzlichen Schritt der Serialisierung über eine Zeichenfolge? Normalerweise würden Sie nur durch einen ObjectOutputStream deserialisieren.

+0

Die Angabe einer serialVersionUID hilft hier nicht. –

Verwandte Themen