48 votes

Convertir un objet quelconque en un tableau d'octets en java

J'ai un objet de type X que je veux convertir en tableau d'octets avant de l'envoyer pour le stocker dans S3. Quelqu'un peut-il me dire comment faire ? Je vous remercie de votre aide.

102voto

Henrik Gustafsson Points 11755

Ce que vous voulez faire s'appelle " sérialisation ". Il y a plusieurs façons de procéder, mais si vous n'avez pas besoin de quelque chose de sophistiqué, je pense que l'utilisation de la balise sérialisation standard des objets Java ferait très bien l'affaire.

Vous pourriez peut-être 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 apportées à ce système. Notamment le fait que vous ne pouvez lire/écrire qu'un seul objet par tableau d'octets, ce qui n'est pas forcément ce que vous voulez.

Notez que "Seuls les objets qui prennent en charge l'option java.io.Serializable peuvent être écrits dans des flux" (voir java.io.ObjectOutputStream ).

Comme vous risquez de le rencontrer, l'allocation et le redimensionnement continus des java.io.ByteArrayOutputStream pourrait s'avérer être un véritable goulot d'étranglement. En fonction de votre modèle de filetage, vous pourriez envisager de réutiliser certains des objets.

Pour la sérialisation d'objets qui n'implémentent pas la fonction Serializable vous devez soit écrire votre propre sérialiseur, par exemple en utilisant les méthodes de lecture*/écriture* de l'interface java.io.DataOutputStream et les méthodes get*/put* de java.nio.ByteBuffer peut-être en même temps que la réflexion, ou en faisant appel à la dépendance d'un tiers.

Ce site propose une liste et une comparaison des performances de certains cadres de sérialisation. En regardant les API, il semble que Kryo pourrait correspondre à ce dont vous avez besoin.

6voto

SANN3 Points 2284

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

4voto

Paul Sasik Points 37766

Ouais. Utilisez juste sérialisation binaire . Vous devez faire en sorte que chaque objet utilise implements Serializable mais c'est simple à partir de là.

L'autre option, si vous voulez éviter de mettre en œuvre l'interface Serializable, est d'utiliser la réflexion et de lire et écrire des données dans un tampon en utilisant un processus comme celui 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 : .

3voto

jtahlborn Points 32515

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. Pour ce faire, il faut placer un GZIPInput/OutputStream entre les flux d'objets et les flux d'octets.

0voto

Bharti Rawat Points 848

Pour convertir le à un tableau d'octets utiliser le concept de Serialization and De-serialization .

L'intégralité conversion d'un objet en tableau d'octets expliqué 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?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X