Java Serializable Object to Byte Array

Diciamo che ho un AppMessage class serializzabile.

Vorrei trasmetterlo come byte[] su socket su un’altra macchina dove viene ricostruito dai byte ricevuti.

Come potrei ottenere questo?

Preparare i byte da inviare:

 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 } } 

Crea object da byte:

 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 } } 

Il modo migliore per farlo è usare SerializationUtils da Apache Commons Lang .

Per serializzare:

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

Per deserializzare:

 YourObject yourObject = SerializationUtils.deserialize(data) 

Come accennato, questo richiede la biblioteca di Commons Lang. Può essere importato usando Gradle:

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

Maven:

   org.apache.commons commons-lang3 3.5  

File jar

E altri modi menzionati qui

In alternativa, è ansible importare l’intera collezione. Segnala questo link

Se si utilizza Java> = 7, è ansible migliorare la soluzione accettata utilizzando try with resources :

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

E viceversa:

 private Object convertFromBytes(byte[] bytes) throws IOException, ClassNotFoundException { try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes); ObjectInput in = new ObjectInputStream(bis)) { return in.readObject(); } } 

Può essere fatto da SerializationUtils , dal metodo serialize & deserialize di ApacheUtils per convertire l’object in byte [] e viceversa, come indicato nella risposta @uris.

Per convertire un object in byte [] serializzando:

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

Per convertire il byte [] in object deserializzando ::

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

Clicca sul link per scaricare org-apache-commons-lang.jar

Integra file .jar facendo clic:

FileName -> Apri Impostazioni Medule -> Seleziona il tuo modulo -> Dipendenze -> Aggiungi file Jar e il gioco è fatto.

Spero che questo aiuti .

Raccomando anche di utilizzare lo strumento SerializationUtils. Voglio fare un commento sbagliato su @Abilash. Il metodo SerializationUtils.serialize() non è limitato a 1024 byte, contrariamente a un’altra risposta qui.

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

A prima vista, si potrebbe pensare che il new ByteArrayOutputStream(1024) consentirà solo una dimensione fissa. Ma se osservi attentamente ByteArrayOutputStream , ByteArrayOutputStream che lo stream crescerà se necessario:

Questa class implementa un stream di output in cui i dati vengono scritti in un array di byte. Il buffer cresce automaticamente man mano che i dati vengono scritti su di esso. I dati possono essere recuperati usando toByteArray() e toString() .

Vorrei trasmetterlo come byte [] su socket su un’altra macchina

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

dove viene ricostruito dai byte ricevuti.

 // When you connect ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); // When you want to receive it AppMessage appMessage = (AppMessage)ois.readObject();