2011-04-29 23 views
48

Tengo un objeto de tipo X que quiero convertir en matriz de bytes antes de enviarlo a la tienda en S3. ¿Alguien puede decirme cómo hacer esto? Aprecio tu ayuda.Convirtiendo cualquier objeto a una matriz de bytes en java

+0

¿hizo alguna intento de leer la documentación antes de hacer esta pregunta? –

+2

Hola, lo hice. El problema es que la única forma que tengo de agregar es usar una API existente que tenemos internamente y usarla para poner datos. Mi objeto se genera en tiempo de ejecución y obtiene los datos de otro objeto y no es serializable. Gracias por la respuesta – Hari

+1

¡Ah, eso lo hace una pregunta muy diferente! Realmente debería haber mencionado que sus objetos no se pueden serializar en la pregunta, porque no lo hizo, todas las respuestas que recibió se refieren a la serialización estándar de Java, que no es aplicable. Es posible que desee hacer una nueva pregunta como "¿Cómo puedo serializar objetos que no implementan Serializable?". La parte de la matriz de bytes no es realmente relevante, suponiendo que sepa cómo escribir una secuencia en una matriz de bytes, lo que hace ahora que ha leído la respuesta de Henrik. –

Respuesta

3

Sí. Simplemente use binary serialization. Tienes que hacer que cada objeto use implements Serializable pero es sencillo desde allí.

Su otra opción, si se quiere evitar que implementa la interfaz Serializable, es utilizar la reflexión y leer y escribir datos a/desde un buffer mediante un proceso de ésta a continuación:

/** 
* Sets all int fields in an object to 0. 
* 
* @param obj The object to operate on. 
* 
* @throws RuntimeException If there is a reflection problem. 
*/ 
public static void initPublicIntFields(final Object obj) { 
    try { 
     Field[] fields = obj.getClass().getFields(); 
     for (int idx = 0; idx < fields.length; idx++) { 
      if (fields[idx].getType() == int.class) { 
       fields[idx].setInt(obj, 0); 
      } 
     } 
    } catch (final IllegalAccessException ex) { 
     throw new RuntimeException(ex); 
    } 
} 

Source.

+1

Hola, gracias de nuevo. No pude hacerlo porque el objeto es del tipo que se está generando y no puedo hacer que sea serializable como lo señaló la otra persona. La API que ya tengo usa una matriz de bytes y no puedo darme cuenta de eso. ¿Hay alguna otra manera o me estoy perdiendo algo? – Hari

+1

La reflexión podría ser el camino a seguir. Pero si el proceso ya está siendo utilizado y funcionando, y solo necesita ayuda para resolverlo, tal vez podría publicar algún código en otra pregunta y obtener ayuda de esa manera. –

+0

el segundo enlace está roto –

101

Lo que quiere hacer es llamar "serialization". Hay varias formas de hacerlo, pero si no necesitas algo elegante, creo que usar el standard Java object serialization sería suficiente.

¿Tal vez podría usar algo como esto?

package com.example; 

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 

public class Serializer { 

    public static byte[] serialize(Object obj) throws IOException { 
     try(ByteArrayOutputStream b = new ByteArrayOutputStream()){ 
      try(ObjectOutputStream o = new ObjectOutputStream(b)){ 
       o.writeObject(obj); 
      } 
      return b.toByteArray(); 
     } 
    } 

    public static Object deserialize(byte[] bytes) throws IOException, ClassNotFoundException { 
     try(ByteArrayInputStream b = new ByteArrayInputStream(bytes)){ 
      try(ObjectInputStream o = new ObjectInputStream(b)){ 
       return o.readObject(); 
      } 
     } 
    } 

} 

Hay varias mejoras que se pueden hacer. No menos importante es el hecho de que solo puede leer/escribir un objeto por matriz de bytes, lo que podría ser o no lo que desea.

Tenga en cuenta que "Solo los objetos que admiten la interfaz java.io.Serializable se pueden escribir en las secuencias" (consulte java.io.ObjectOutputStream).

Dado que es posible que se encuentre con este problema, la asignación y el cambio de tamaño continuos de la java.io.ByteArrayOutputStream puede ser bastante el cuello de la botella. Dependiendo de su modelo de subprocesamiento, es posible que desee considerar la reutilización de algunos de los objetos.

para la serialización de objetos que no implementa la interfaz Serializable que sea necesario escribir su propio serializador, por ejemplo utilizando los métodos * Más */escritura de java.io.DataOutputStream y el get */put * métodos de java.nio.ByteBuffer tal vez junto con la reflexión , o atraer a una dependencia de terceros.

This site tiene una lista y comparación de rendimiento de algunos marcos de serialización. En cuanto a las API, parece que Kryo podría adaptarse a lo que necesita.

+0

Hola, gracias de nuevo. No pude hacerlo porque el objeto es del tipo que se está generando y no puedo hacer que sea serializable como lo señaló la otra persona. La API que ya tengo usa una matriz de bytes y no puedo darme cuenta de eso. ¿Hay alguna otra manera o me estoy perdiendo algo? – Hari

+0

Muy bien, agregué una breve sección sobre dónde obtener otros serializadores. –

3

Como he mencionado en otras preguntas similares, puede que desee considerar la compresión de los datos, ya que la serialización java predeterminada es un poco detallada. usted hace esto al poner un GZIPInput/OutputStream entre las secuencias de Objeto y las secuencias de Byte.

5

Utilice serialize y deserialize métodos en SerializationUtils de commons-lang.

+1

lo usé y es lento en mi lectura de mi disco estoy buscando alternativas como kryo y fst – shareef

0

Para convertir el objeto en una matriz de bytes utilice el concepto de Serialization and De-serialization.

La conversión completa de de matriz de objetos a bytes explicada en el tutorial.

http://javapapers.com/core-java/java-serialization/

Q. How can we convert object into byte array? 

Q. How can we serialize a object? 

Q. How can we De-serialize a object? 

Q. What is the need of serialization and de-serialization? 
Cuestiones relacionadas