Digamos que tengo una clase serializable AppMessage
.
Me gustaría transmitirlo a byte[]
través de sockets a otra máquina donde se reconstruye a partir de los bytes recibidos.
¿Cómo podría lograr esto?
java
object
serialization
iTEgg
fuente
fuente
byte[]
? ¿Por qué no escribirlo directamente en el zócaloObjectOutputStream
y leerlo conObjectInputStream
?new ObjectMapper().writeValueAsBytes(JAVA_OBJECT_HERE)
Respuestas:
Prepare la matriz de bytes para enviar:
Cree un objeto a partir de una matriz de bytes:
fuente
ObjectInput
,ObjectOuput
,ByteArrayOutputStream
YByteArrayInputStream
toda implementar elAutoCloseable
interfaz, ¿no sería una buena práctica para usarlo para evitar perder su cierre por error? (No estoy del todo seguro de si esto es la mejor práctica, por eso me pregunto.) Ejemplo:try(ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutput out = new ObjectOutputStream(bos)){ /*Do stuff*/ }catch(IOException e){/*suppress exception*/}
. También elimina la necesidad de lafinal
cláusula y su adicionaltry-catch
.La mejor manera de hacerlo es usarlo
SerializationUtils
desde Apache Commons Lang .Para serializar:
Para deserializar:
Como se mencionó, esto requiere la biblioteca Commons Lang. Se puede importar usando Gradle:
Maven
Archivo jar
Y más formas mencionadas aquí
Alternativamente, se puede importar toda la colección. Consulte este enlace
fuente
Si usa Java> = 7, podría mejorar la solución aceptada usando probar con recursos :
Y a la inversa:
fuente
Se puede hacer con SerializationUtils , con el método de serialización y deserialización de ApacheUtils para convertir el objeto en byte [] y viceversa, como se indica en la respuesta @uris.
Para convertir un objeto en byte [] serializando:
Para convertir el byte [] en objeto deserializando ::
Haga clic en el enlace para descargar org-apache-commons-lang.jar
Integre el archivo .jar haciendo clic en:
FileName -> Open Medule Settings -> Seleccione su módulo -> Dependencias -> Agregar archivo Jar y ya está.
Espero que esto ayude .
fuente
También recomiendo usar la herramienta SerializationUtils. Quiero ajustar un comentario equivocado de @Abilash. El
SerializationUtils.serialize()
método no está restringido a 1024 bytes, al contrario de otra respuesta aquí.A primera vista, puede pensar que
new ByteArrayOutputStream(1024)
solo permitirá un tamaño fijo. Pero si observa de cercaByteArrayOutputStream
, descubrirá que la corriente crecerá si es necesario:fuente
fuente
Otro método interesante es de
com.fasterxml.jackson.databind.ObjectMapper
byte[] data = new ObjectMapper().writeValueAsBytes(JAVA_OBJECT_HERE)
Dependencia de Maven
fuente
Spring Framework
org.springframework.util.SerializationUtils
fuente
Si está utilizando spring, hay una clase de utilidad disponible en spring-core. Simplemente puedes hacer
fuente
ejemplo de código con java 8+:
fuente
En caso de que desee una buena solución de copiar y pegar sin dependencias. Toma el código a continuación.
Ejemplo
Fuente
fuente
Esta es solo una forma de código optimizado de la respuesta aceptada en caso de que alguien quiera usar esto en producción:
fuente