2010-09-17 16 views
44

Necesito convertir objetos en un byte [] para almacenarlos en el almacén de valores-clave del gabinete de Tokio. También necesito destrabar el byte [] a un Objeto cuando lea desde el almacén de clave-valor.Java: objeto a byte [] y byte [] al convertidor de objeto (para el gabinete de Tokio)

¿Hay algún paquete que me ayude con esta tarea? ¿O sería la mejor solución para implementarlo yo mismo?

+2

Haga su clase [Serializable] (http://download.oracle.com/javase/6/docs/api/java/io/Serializable.html), luego use la respuesta en [ Objeto Serializable de Java a la matriz de bytes ] (http://stackoverflow.com/questions/2836646/java-serializable-object-to-byte-array). –

+0

no es un duplicado exacto, aunque parece tan – Bozho

Respuesta

119
public static byte[] serialize(Object obj) throws IOException { 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    ObjectOutputStream os = new ObjectOutputStream(out); 
    os.writeObject(obj); 
    return out.toByteArray(); 
} 
public static Object deserialize(byte[] data) throws IOException, ClassNotFoundException { 
    ByteArrayInputStream in = new ByteArrayInputStream(data); 
    ObjectInputStream is = new ObjectInputStream(in); 
    return is.readObject(); 
} 
+0

no te olvides de llamar a 'is.close' y' in.close'. –

+16

'is.close' y' in.close' no son necesarios en este caso porque es una transmisión en memoria. Lo único que haría aquí es hacerlo más lento y más detallado. Pero entiendo que el IDE podría marcar el código anterior porque la transmisión no está cerrada. –

+3

No creo que vaya a ser más lento, solo es un método vacío, por lo que la diferencia de tiempo debe ser muy baja. Pero tiene razón: 'Cerrar un ByteArrayOutputStream no tiene efecto. [Java Doc] (http://docs.oracle.com/javase/6/docs/api/java/io/ByteArrayOutputStream.html#close%28%29) Impresionante: D –

9

Si su clase se extiende Serializable, puede escribir y leer objetos a través de ByteArrayOutputStream, eso es lo que suelo hacer.

+3

Todos los tipos incluidos como variables en su clase (y todos los tipos en esos tipos, etc.) también deben ser serializables. –

+0

En realidad, necesitará un ObjectOutputStream para envolver el BAOS también ... Pero sí, esa es la forma más fácil de hacerlo. –

+0

Consideraría usar algo que no sea la serialización incorporada de Java, también: serialización de JBoss, JSerial, Avro, etc., o un formato XML como XStream o Javolution marshalling plus gzip. La serialización estándar no es particularmente rápida, y aunque su eficiencia de espacio marginal es buena, hay un poco de sobrecarga por flujo. –

5

Puede ver cómo Hector hace esto para Cassandra, donde el objetivo es el mismo: convertir todo en y desde byte[] para almacenar/recuperar de una base de datos NoSQL - see here. Para los tipos primitivos (+ String), hay serializadores especiales, de lo contrario existe el genérico ObjectSerializer (esperando Serializable y usando ObjectOutputStream). Por supuesto, puede usarlo solo para todo, pero puede haber metadatos redundantes en forma serializada.

Supongo que puede copiar todo el paquete y hacer uso de él.