Objet sérialisable Java au tableau D'octets

Disons que j'ai une classe sérialisable AppMessage.

Je voudrais le transmettre comme byte[] sur les sockets à une autre machine où il est reconstruit à partir des octets reçus.

Comment pourrais-je y parvenir?

241
demandé sur lambda 2010-05-14 22:31:20

6 réponses

Préparer les octets à envoyer:

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = null;
try {
  out = new ObjectOutputStream(bos);   
  out.writeObject(yourObject);
  out.flush();
  byte[] yourBytes = bos.toByteArray();
  ...
} finally {
  try {
    bos.close();
  } catch (IOException ex) {
    // ignore close exception
  }
}

Créer un objet à partir d'octets:

ByteArrayInputStream bis = new ByteArrayInputStream(yourBytes);
ObjectInput in = null;
try {
  in = new ObjectInputStream(bis);
  Object o = in.readObject(); 
  ...
} finally {
  try {
    if (in != null) {
      in.close();
    }
  } catch (IOException ex) {
    // ignore close exception
  }
}
362
répondu Taylor Leese 2016-09-18 03:23:24

La meilleure façon de le faire est d'utiliser SerializationUtils à partir de Apache Commons Lang.

Pour sérialiser:

byte[] data = SerializationUtils.serialize(yourObject);

Pour désérialiser:

YourObject yourObject = SerializationUtils.deserialize(data)

Comme mentionné, cela nécessite la bibliothèque Lang de Commons. Il peut être importé en utilisant Gradle:

compile 'org.apache.commons:commons-lang3:3.5'

Maven:

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.5</version>
</dependency>

Fichier Jar

Et plus de moyens mentionné ici

Alternativement, la collection entière peut être importée. Référez-vous à ce lien

262
répondu uris 2017-11-09 14:22:50

Si vous utilisez Java > = 7, vous pouvez améliorer la solution acceptée en utilisant try avec resources :

private byte[] convertToBytes(Object object) throws IOException {
    try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
         ObjectOutput out = new ObjectOutputStream(bos)) {
        out.writeObject(object);
        return bos.toByteArray();
    } 
}

Et l'inverse:

private Object convertFromBytes(byte[] bytes) throws IOException, ClassNotFoundException {
    try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
         ObjectInput in = new ObjectInputStream(bis)) {
        return in.readObject();
    } 
}
67
répondu Víctor Romero 2015-08-06 17:36:52

Peut être fait par Sérialisationutils, par la méthode serialize & deserialize par ApacheUtils pour convertir l'objet en byte[] et vice-versa, comme indiqué dans la réponse @ uris.

Pour convertir un objet en octet [] en sérialisant:

byte[] data = SerializationUtils.serialize(object);

Pour convertir l'octet [] en objet en désérialisant::

Object object = (Object) SerializationUtils.deserialize(byte[] data)

Cliquez sur le lien pour Téléchargement org-apache commons-lang.jar

Intégrer .fichier jar en cliquant sur:

Nom Du Fichier -> Ouvrir Médule Paramètres -> Sélectionnez votre module -> Dépendances -> Ajouter des fichiers Jar et vous avez terminé.

J'espère que cela aide .

3
répondu Pankaj Lilan 2017-04-22 05:01:13

Je recommande également D'utiliser L'outil SerializationUtils. Je veux faire un ajustement sur un mauvais commentaire de @ Abilash. La méthode SerializationUtils.serialize() est Pas limitée à 1024 octets, contrairement à une autre réponse ici.

public static byte[] serialize(Object object) {
    if (object == null) {
        return null;
    }
    ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
    try {
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(object);
        oos.flush();
    }
    catch (IOException ex) {
        throw new IllegalArgumentException("Failed to serialize object of type: " + object.getClass(), ex);
    }
    return baos.toByteArray();
}

, À première vue, vous pouvez penser que new ByteArrayOutputStream(1024) permettra seulement une taille fixe. Mais si vous regardez de près le ByteArrayOutputStream, vous comprendrez que le flux va croître si nécessaire:

Cette classe implémente un flux de sortie dans lequel les données sont écrit dans un octets. Le tampon se développe automatiquement en tant que données il contient. Les données peuvent être récupérées en utilisant toByteArray() et toString().

0
répondu gzg_55 2018-05-15 07:17:27

Je voudrais le transmettre sous forme d'octet [] sur des sockets à une autre machine

// When you connect
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
// When you want to send it
oos.writeObject(appMessage);

Où il est reconstruit à partir des octets reçus.

// When you connect
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
// When you want to receive it
AppMessage appMessage = (AppMessage)ois.readObject();
0
répondu user207421 2018-05-15 07:20:06