Disons que j'ai une classe sérialisable AppMessage
.
Je voudrais le transmettre comme byte[]
sur des sockets à une autre machine où il est reconstruit à partir des octets reçus.
Comment pourrais-je y parvenir?
java
object
serialization
iTEgg
la source
la source
byte[]
? Pourquoi ne pas simplement l'écrire directement dans le socket avecObjectOutputStream
, et le lire avecObjectInputStream
?new ObjectMapper().writeValueAsBytes(JAVA_OBJECT_HERE)
Réponses:
Préparez le tableau d'octets à envoyer:
Créez un objet à partir d'un tableau d'octets:
la source
ObjectInput
,ObjectOuput
,ByteArrayOutputStream
EtByteArrayInputStream
mettre en œuvre toute l'AutoCloseable
interface, ne serait - il une bonne pratique de l' utiliser pour éviter de manquer les fermer par erreur? (Je ne suis pas tout à fait sûr que ce soit la meilleure pratique, qui est la raison pour laquelle je me demande.) Exemple:try(ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutput out = new ObjectOutputStream(bos)){ /*Do stuff*/ }catch(IOException e){/*suppress exception*/}
. Il supprime également la nécessité de lafinal
clause et son additionneltry-catch
.La meilleure façon de le faire est d'utiliser
SerializationUtils
Apache Commons Lang .Pour sérialiser:
Pour désérialiser:
Comme mentionné, cela nécessite la bibliothèque Commons Lang. Il peut être importé à l'aide de Gradle:
Maven:
Fichier Jar
Et plus de façons mentionnées ici
Alternativement, la collection entière peut être importée. Référez ce lien
la source
Si vous utilisez Java> = 7, vous pouvez améliorer la solution acceptée en utilisant try with resources :
Et l'inverse:
la source
Peut être fait par SerializationUtils , par la méthode serialize & deserialize par ApacheUtils pour convertir l'objet en octet [] et vice-versa, comme indiqué dans la réponse @uris.
Pour convertir un objet en octet [] en sérialisant:
Pour convertir l'octet [] en objet en désérialisant ::
Cliquez sur le lien pour télécharger org-apache-commons-lang.jar
Intégrez le fichier .jar en cliquant sur:
FileName -> Open Medule Settings -> Select your module -> Dependencies -> Add Jar file et vous avez terminé.
J'espère que cela vous aidera .
la source
Je recommande également d'utiliser l'outil SerializationUtils. Je veux faire un ajustement sur un mauvais commentaire de @Abilash. La
SerializationUtils.serialize()
méthode n'est pas limitée à 1024 octets, contrairement à une autre réponse ici.À première vue, vous pouvez penser que
new ByteArrayOutputStream(1024)
cela ne permettra qu'une taille fixe. Mais si vous regardez attentivement leByteArrayOutputStream
, vous comprendrez que le flux augmentera si nécessaire:la source
la source
Une autre méthode intéressante est de
com.fasterxml.jackson.databind.ObjectMapper
byte[] data = new ObjectMapper().writeValueAsBytes(JAVA_OBJECT_HERE)
Dépendance Maven
la source
Cadre Spring
org.springframework.util.SerializationUtils
la source
Si vous utilisez un ressort, une classe util est disponible dans le noyau de ressort. Vous pouvez simplement faire
la source
exemple de code avec java 8+:
la source
Dans le cas où vous voulez une belle solution de copier-coller sans dépendances. Prenez le code ci-dessous.
Exemple
La source
la source
Ceci est juste une forme de code optimisée de la réponse acceptée au cas où quelqu'un voudrait l'utiliser en production:
la source