Objeto Java Serializable para Matriz de Bytes

Digamos que eu tenha uma class serializável AppMessage .

Eu gostaria de transmiti-lo como byte[] sobre sockets para outra máquina onde é reconstruído a partir dos bytes recebidos.

Como eu poderia conseguir isso?

Prepare bytes para enviar:

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

Criar object de bytes:

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

A melhor maneira de fazer isso é usar o SerializationUtils do Apache Commons Lang .

Para serializar:

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

Para desserializar:

 YourObject yourObject = SerializationUtils.deserialize(data) 

Como mencionado, isso requer a biblioteca Commons Lang. Pode ser importado usando o Gradle:

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

Maven:

   org.apache.commons commons-lang3 3.5  

Arquivo Jar

E mais maneiras mencionadas aqui

Como alternativa, toda a coleção pode ser importada. Indique este link

Se você usar Java> = 7, poderá melhorar a solução aceita usando os resources try :

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

E o contrário:

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

Pode ser feito por SerializationUtils , pelo método serialize & deserialize do ApacheUtils para converter object em byte [] e vice-versa, como indicado em @uris answer.

Para converter um object em byte [] por serialização:

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

Para converter byte [] para object pela desserialização ::

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

Clique no link para fazer o download do org-apache-commons-lang.jar

Integre o arquivo .jar clicando em:

FileName -> Open Medule Settings -> Selecione seu módulo -> Dependências -> Adicionar arquivo Jar e está feito.

Espero que isso ajude .

Eu também recomendo usar a ferramenta SerializationUtils. Eu quero fazer um ajuste em um comentário errado por @Abilash. O método SerializationUtils.serialize() não está restrito a 1024 bytes, ao contrário de outra resposta aqui.

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

À primeira vista, você pode pensar que o new ByteArrayOutputStream(1024) permitirá apenas um tamanho fixo. Mas se você observar atentamente o ByteArrayOutputStream , descobrirá que o stream crescerá, se necessário:

Essa class implementa um stream de saída no qual os dados são gravados em uma matriz de bytes. O buffer cresce automaticamente à medida que os dados são gravados nele. Os dados podem ser recuperados usando toByteArray() e toString() .

Eu gostaria de transmiti-lo como byte [] sobre sockets para outra máquina

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

onde é reconstruído a partir dos bytes recebidos.

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