Conversione di qualsiasi object in un array di byte in java

Ho un object di tipo X che voglio convertire in array di byte prima di inviarlo per l’archiviazione in S3. Qualcuno può dirmi come fare questo? Apprezzo il vostro aiuto.

Quello che vuoi fare è chiamato ” serializzazione “. Ci sono diversi modi per farlo, ma se non hai bisogno di niente di fantasia, penso che l’uso della serializzazione degli oggetti Java standard sarebbe perfetto.

Forse potresti usare qualcosa del genere?

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

Ci sono diversi miglioramenti a ciò che si può fare. Non per niente il fatto che puoi solo leggere / scrivere un object per matrice di byte, che potrebbe o non potrebbe essere quello che vuoi.

Si noti che “Solo gli oggetti che supportano l’interfaccia java.io.Serializable possono essere scritti su flussi” (vedere java.io.ObjectOutputStream ).

Poiché potresti incontrarlo, l’allocazione e il ridimensionamento continui di java.io.ByteArrayOutputStream potrebbero rivelarsi un vero e proprio collo di bottiglia. A seconda del modello di threading, potresti prendere in considerazione il riutilizzo di alcuni oggetti.

Per la serializzazione di oggetti che non implementano l’interfaccia Serializable è necessario scrivere il proprio serializzatore, ad esempio utilizzando i metodi read * / write * di java.io.DataOutputStream e i metodi get * / put * di java.nio.ByteBuffer forse insieme con la riflessione, o tirare in una dipendenza di terze parti.

Questo sito ha un elenco e il confronto delle prestazioni di alcuni framework di serializzazione. Guardando le API sembra che Kryo potrebbe adattarsi a ciò di cui hai bisogno.

Utilizzare i metodi serialize e deserialize in SerializationUtils da common-lang .

Si. Basta usare la serializzazione binaria . Devi fare in modo che ogni object usi gli implements Serializable ma è semplice da lì.

L’altra opzione, se si desidera evitare l’implementazione dell’interfaccia Serializable, è quella di utilizzare la riflessione e leggere e scrivere dati da / verso un buffer usando un processo qui sotto:

 /** * 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 .

Come ho menzionato in altre domande simili, potresti prendere in considerazione la possibilità di comprimere i dati poiché la serializzazione java predefinita è un po ‘prolissa. lo fai mettendo GZIPInput / OutputStream tra i flussi Object e i flussi Byte.

Per convertire l’ object in una matrice di byte, utilizzare il concetto di Serialization and De-serialization .

La conversione completa dalla matrice object a byte spiegata in è 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?