Convirtiendo cualquier objeto a una matriz de bytes en java

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.

Lo que quiere hacer se llama ” serialización “. Hay varias maneras de hacerlo, pero si no necesita algo sofisticado, creo que usar la serialización de objetos Java estándar sería muy útil.

Tal vez podrías 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 a esto que pueden hacerse. 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 esto, la asignación y el cambio de tamaño continuo de java.io.ByteArrayOutputStream podría ser bastante complicado. 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 implementan la interfaz Serializable , debe escribir su propio serializador, por ejemplo, utilizando los métodos read * / write * de java.io.DataOutputStream y los métodos get * / put * de java.nio.ByteBuffer tal vez junto con la reflexión, o atraer a una dependencia de terceros.

Este sitio tiene una lista y una comparación de rendimiento de algunos marcos de serialización. Al mirar las API, parece que Kryo podría adaptarse a lo que necesita.

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

Sí. Solo use serialización binaria . Tienes que hacer que cada objeto utilizado implements Serializable pero es sencillo desde allí.

Su otra opción, si desea evitar la implementación de la interfaz Serializable, es usar reflexión y leer y escribir datos en / desde un búfer usando un proceso como el siguiente:

 /** * 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); } } 

Fuente

Como mencioné en otras preguntas similares, es posible 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.

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

La conversión completa de la matriz de objetos a byte explicada en es 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?