2009-03-24 15 views
5

estoy tratando de serializar y deserializar un lista de arreglo con un objeto en el interior:no puede serializar/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(); 
} 

objeto La HairList es también un objeto serializable.

ejecución Este código está devolviendo el siguiente error:

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

en línea paramDecoded = (ArrayList<HairBirt>) obj_in.readObject();

No sé lo que estoy haciendo mal. ¿Puedes dar un consejo?

Actualización:

resolvió: acaba de utilizar una matriz natural de HairBirt en lugar de un ArrayList y funciona:

HairBirt[] list = new HairBirt[x]; 

en lugar de

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

Gracias a todos por tu ayuda.

Respuesta

9

No utilice ByteArrayOutputStream.toString() - en su lugar, use toByteArray() y base64-codifique esos datos binarios para convertirlos en una cadena sin perder información.

Sospecho que ese es el problema principal: que estaba perdiendo los datos después de la serialización. Probablemente también deba cerrar o al menos lavar el ObjectOutputStream. No sé de entrada si eso realmente hace algo en este caso, pero parece ser una buena idea.

No creo que haya compatibilidad con base64 directamente en Java (en una clase pública, de todos modos), pero hay varias bibliotecas de terceros que puede usar, como the one in the Apache Commons Codec library.

+0

Sí, ese es el problema, pero realmente necesito usar String en ese movimiento ... Este no es el problema real, es una simplificación. – sakana

+0

¿Qué quiere decir con 'en ese movimiento'? Deberá * tener * para convertir el BAOS en una cadena de una manera sin pérdida si desea poder deserializarlo. Si eso es con base64 o no es una cuestión diferente, pero creo que es una buena manera de hacerlo. –

+0

@sakana: base64 es un formato de cadena con un juego de caracteres limitado. – Powerlord

0

¿Ha intentado anular este comportamiento declarando su propio serialVersionUID en su clase personalizada?

¿Tiene una razón específica para hacer el paso adicional de serializar a través de una cadena? Normalmente, simplemente se deserializaría a través de un ObjectOutputStream.

+0

Declarar un serialVersionUID no ayuda aquí. –

Cuestiones relacionadas