Convertendo qualquer object em uma matriz de bytes em java

Eu tenho um object do tipo X que eu quero converter em array de bytes antes de enviá-lo para armazenar no S3. Alguém pode me dizer como fazer isso? Eu aprecio sua ajuda.

O que você quer fazer é chamado de ” serialização “. Existem várias maneiras de fazê-lo, mas se você não precisar de nada sofisticado, acho que usar a serialização padrão de objects Java funcionaria muito bem.

Talvez você possa usar algo assim?

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

Existem várias melhorias para isso que podem ser feitas. Não é de forma alguma o fato de que você só pode ler / escrever um object por matriz de bytes, que pode ou não ser o que você deseja.

Observe que “somente objects que suportam a interface java.io.Serializable podem ser gravados em streams” (consulte java.io.ObjectOutputStream ).

Como você pode se deparar com isso, a alocação e o redimensionamento contínuos do java.io.ByteArrayOutputStream podem se tornar bastante comuns. Dependendo do seu modelo de segmentação, você pode considerar a possibilidade de reutilizar alguns dos objects.

Para serialização de objects que não implementam a interface Serializable , você precisa escrever seu próprio serializador, por exemplo, usando os methods read * / write * de java.io.DataOutputStream e os methods get * / put * de java.nio.ByteBuffer talvez junto com a reflection, ou puxe uma dependência de terceiros.

Este site tem uma lista e comparação de desempenho de algumas estruturas de serialização. Olhando para as APIs, parece que Kryo pode se encheckboxr no que você precisa.

Use serialize e deserialize methods em SerializationUtils de commons-lang .

Sim. Apenas use serialização binária . Você tem que ter cada object usado para implements Serializable mas é simples a partir daí.

Sua outra opção, se você quiser evitar a implementação da interface Serializable, é usar reflection e ler e gravar dados em / de um buffer usando um processo abaixo:

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

Fonte

Como eu mencionei em outras questões semelhantes, você pode querer considerar a compactação dos dados, pois a serialização padrão do java é um pouco detalhada. você faz isso colocando um GZIPInput / OutputStream entre os streams Object e os Byte.

Para converter o object em uma matriz de bytes, use o conceito de Serialization and De-serialization .

A conversão completa da matriz de object para byte explicada em é 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?