Java-serialisierbares Objekt zu Byte-Array

Nehmen wir an, ich habe eine serialisierbare AppMessage class.

Ich möchte es als byte[] über Sockets an eine andere Maschine übertragen, wo es aus den empfangenen Bytes neu aufgebaut wird.

Wie könnte ich das erreichen?

   

Vorbereiten der zu sendenden Bytes:

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

Objekt aus Bytes erstellen:

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

Am besten verwenden Sie SerializationUtils von Apache Commons Lang .

Um zu serialisieren:

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

Deserialisieren:

 YourObject yourObject = SerializationUtils.deserialize(data) 

Wie erwähnt, erfordert dies Commons Lang Bibliothek. Es kann mit Gradle importiert werden:

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

Maven:

   org.apache.commons commons-lang3 3.5  

Jar-Datei

Und mehr Wege, die hier erwähnt werden

Alternativ kann die gesamte Sammlung importiert werden. Siehe diesen Link

Wenn Sie Java> = 7 verwenden, können Sie die akzeptierte Lösung mithilfe von try with resources verbessern:

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

Und umgekehrt:

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

Kann durch SerializationUtils , serialize & deserialize Methode von ApacheUtils durchgeführt werden, um Objekt in byte [] und umgekehrt umzuwandeln, wie in @uris answer angegeben.

So konvertieren Sie ein Objekt in Byte [] durch Serialisierung:

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

So konvertieren Sie Byte [] in ein Objekt durch Deserialisierung ::

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

Klicken Sie auf den Link zum Herunterladen von org-apache-commons-lang.jar

Integrieren Sie die .jar-Datei durch Klicken auf:

FileName -> Medule Einstellungen öffnen -> Wählen Sie Ihr Modul -> Abhängigkeiten -> Jar-Datei hinzufügen und Sie sind fertig.

Hoffe, das hilft .

Ich empfehle auch, das SerializationUtils-Tool zu verwenden. Ich möchte einen falschen Kommentar von @Afilash machen. Die Methode SerializationUtils.serialize() ist nicht auf 1024 Bytes beschränkt, im Gegensatz zu einer anderen Antwort hier.

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

Auf den ersten Blick mag man meinen, dass new ByteArrayOutputStream(1024) nur eine feste Größe zulässt. Aber wenn Sie sich den ByteArrayOutputStream genauer ansehen, werden Sie ByteArrayOutputStream , dass der Stream bei Bedarf wächst:

Diese class implementiert einen Ausgabestream, in dem die Daten in ein Byte-Array geschrieben werden. Der Puffer wächst automatisch, wenn Daten in ihn geschrieben werden. Die Daten können mit toByteArray() und toString() abgerufen werden.

Ich möchte es als Byte [] über Sockets an einen anderen Rechner übertragen

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

wo es aus den empfangenen Bytes neu aufgebaut wird.

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