Digamos que eu tenha uma classe serializável AppMessage
.
Eu gostaria de transmiti-lo como byte[]
soquetes para outra máquina onde é reconstruído a partir dos bytes recebidos.
Como eu consegui isso?
java
object
serialization
iTEgg
fonte
fonte
byte[]
? Por que não escrever diretamente no soqueteObjectOutputStream
e ler com eleObjectInputStream
?new ObjectMapper().writeValueAsBytes(JAVA_OBJECT_HERE)
Respostas:
Prepare a matriz de bytes para enviar:
Crie um objeto a partir de uma matriz de bytes:
fonte
ObjectInput
,ObjectOuput
,ByteArrayOutputStream
EByteArrayInputStream
tudo implementar aAutoCloseable
interface, não seria uma boa prática para usá-lo para evitar a falta de fechá-los por engano? (Eu não estou totalmente certo se esta é a melhor prática, é por isso que eu estou querendo saber.) Exemplo:try(ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutput out = new ObjectOutputStream(bos)){ /*Do stuff*/ }catch(IOException e){/*suppress exception*/}
. Ele também elimina a necessidade dafinal
cláusula e sua adicionaltry-catch
.A melhor maneira de fazer isso é usar o
SerializationUtils
Apache Commons Lang .Para serializar:
Para desserializar:
Como mencionado, isso requer a biblioteca Commons Lang. Pode ser importado usando o Gradle:
Maven:
Arquivo Jar
E mais maneiras mencionadas aqui
Como alternativa, toda a coleção pode ser importada. Consulte este link
fonte
Se você usa Java> = 7, poderá melhorar a solução aceita usando try with resources :
E o contrário:
fonte
Pode ser feito pelo SerializationUtils , pelo método serialize & desserialize pelo ApacheUtils para converter o objeto em byte [] e vice-versa, conforme indicado na resposta @uris.
Para converter um objeto em byte [] serializando:
Para converter byte [] em objeto, desserializando:
Clique no link para baixar org-apache-commons-lang.jar
Integre o arquivo .jar clicando em:
FileName -> Open Medule Settings -> Selecione seu módulo -> Dependencies -> Add Jar file e pronto.
Espero que isso ajude .
fonte
Também recomendo usar a ferramenta SerializationUtils. Quero fazer um ajuste em um comentário errado de @Abilash. O
SerializationUtils.serialize()
método não está restrito a 1024 bytes, ao contrário de outra resposta aqui.À primeira vista, você pode pensar que
new ByteArrayOutputStream(1024)
isso permitirá apenas um tamanho fixo. Mas se você der uma olhada de pertoByteArrayOutputStream
, você descobrirá que o fluxo aumentará se necessário:fonte
fonte
Outro método interessante é de
com.fasterxml.jackson.databind.ObjectMapper
byte[] data = new ObjectMapper().writeValueAsBytes(JAVA_OBJECT_HERE)
Dependência do Maven
fonte
Spring Framework
org.springframework.util.SerializationUtils
fonte
Se você estiver usando spring, há uma classe util disponível no spring-core. Você pode simplesmente fazer
fonte
exemplo de código com java 8+:
fonte
Caso você queira uma solução agradável de copiar e colar sem dependências. Pegue o código abaixo.
Exemplo
Fonte
fonte
Este é apenas um formulário de código otimizado da resposta aceita, caso alguém queira usá-lo na produção:
fonte