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ócaloObjectOutputStreamy 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,ByteArrayOutputStreamYByteArrayInputStreamtoda implementar elAutoCloseableinterfaz, ¿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 lafinalcláusula y su adicionaltry-catch.La mejor manera de hacerlo es usarlo
SerializationUtilsdesde 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.ObjectMapperbyte[] data = new ObjectMapper().writeValueAsBytes(JAVA_OBJECT_HERE)Dependencia de Maven
fuente
Spring Framework
org.springframework.util.SerializationUtilsfuente
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