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?
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
}
}
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>
Et plus de moyens mentionné ici
Alternativement, la collection entière peut être importée. Référez-vous à ce lien
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();
}
}
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 .
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()
ettoString()
.
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();