Conversion d’un object en tableau d’octets en Java

J’ai un object de type X que je veux convertir en tableau d’octets avant de l’envoyer dans S3. Quelqu’un peut-il me dire comment faire cela? J’apprécie ton aide.

Ce que vous voulez faire s’appelle ” sérialisation “. Il y a plusieurs manières de le faire, mais si vous n’avez besoin de rien de compliqué, je pense que l’utilisation de la sérialisation d’object Java standard serait parfaite.

Peut-être pourriez-vous utiliser quelque chose comme ça?

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

Plusieurs améliorations peuvent être apscopes à cela. Pas du tout le fait que vous ne pouvez lire / écrire qu’un object par tableau d’octets, ce qui peut ou non être ce que vous voulez.

Notez que “Seuls les objects java.io.Serializable charge l’interface java.io.Serializable peuvent être écrits dans les stream” (voir java.io.ObjectOutputStream ).

Étant donné que vous pourriez vous heurter à cela, l’allocation et le redimensionnement continus de java.io.ByteArrayOutputStream pourraient s’avérer être un java.io.ByteArrayOutputStream -tête. Selon votre modèle de thread, vous pouvez envisager de réutiliser certains objects.

Pour la sérialisation des objects qui n’implémentent pas l’interface Serializable , vous devez soit écrire votre propre sérialiseur, par exemple en utilisant les méthodes read * / write * de java.io.DataOutputStream et les méthodes get * / put * de java.nio.ByteBuffer peut-être avec reflection ou tirer parti d’une dépendance de tiers.

Ce site a une liste et une comparaison des performances de certains frameworks de sérialisation. En regardant les API, il semble que Kryo puisse correspondre à vos besoins.

Utilisez les méthodes serialize et deserialize dans SerializationUtils partir de commons-lang .

Ouais. Utilisez simplement la sérialisation binary . Vous devez avoir chaque utilisation d’object implements Serializable mais c’est simple à partir de là.

Votre autre option, si vous voulez éviter d’implémenter l’interface Serializable, consiste à utiliser la reflection et à lire et écrire des données vers / depuis un tampon en utilisant un processus ci-dessous:

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

Comme je l’ai mentionné dans d’autres questions similaires, vous pouvez envisager de compresser les données, car la sérialisation Java par défaut est un peu verbeuse. Vous faites cela en plaçant un GZIPInput / OutputStream entre les stream Object et les stream Byte.

Pour convertir l’ object en un tableau d’octets, utilisez le concept de Serialization and De-serialization .

La conversion complète du tableau object en octet expliquée dans ce tutoriel.

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?