2010-05-14 17 views
214

Digamos que tengo una clase serializable AppMessage.Objeto Serializable de Java a la matriz de bytes

Me gustaría transmitirlo como byte[] sobre sockets a otra máquina donde se reconstruye a partir de los bytes recibidos.

¿Cómo puedo lograr esto?

+1

¿Por qué como 'byte []'? ¿Por qué no simplemente escribirlo directamente en el socket con 'ObjectOutputStream', y leerlo con' ObjectInputStream'? – EJP

+0

@wuhaochi ¿Realmente * necesita un ejemplo de 'ObjectOutputStream.writeObject()' y 'ObiectInputStream.readObject()'? – EJP

Respuesta

327

Preparar bytes a 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 
    } 
} 

crear el objeto 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 
    } 
} 
+4

Esta no es una respuesta completa, solo dice cómo transformar la clase 'Serializable' en matriz de bytes, pero la pregunta en sí misma abarca todo el tema, incluyendo RMI, construcción y deconstrucción de objetos, mecanismos de serialización y versiones, etc. – Esko

+32

Así no es como Leí la pregunta. Para mí, parece que su problema es cómo convertir el objeto en un byte [], no cómo enviarlo. –

+1

Taylor: sí, lo tienes bien. quiero convertir el objeto en un byte [] y transmitirlo. ¿pueden proporcionar también el código sobre cómo convertir este byte [] en un objeto, por favor? – iTEgg

233

La mejor manera de hacerlo es utilizar SerializationUtils de Apache Commons Lang.

para serializar:

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

deserializar:

YourObject yourObject = SerializationUtils.deserialize(data) 

Como se ha mencionado, esto requiere la biblioteca Commons Lang. Se puede importarse utilizando Gradle:

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

Maven:

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> 
<dependency> 
    <groupId>org.apache.commons</groupId> 
    <artifactId>commons-lang3</artifactId> 
    <version>3.5</version> 
</dependency> 

Jar file

y más formas mencionadas here

Alternativamente, toda la colección puede ser importado. Consulte this link

+49

¿Sobrecarga? También podría reconstruir la rueda en este punto. En serio, es mucho más fácil entender este unipersonal y reducir los posibles errores (como no cerrar el flujo en el momento adecuado y otras cosas). – ALOToverflow

+0

Esto es simple y directo a diferencia del 99% de las otras respuestas que hay sobre esta pregunta exacta. –

+0

Utilicé su respuesta, uris, y no puedo entender por qué recibo "java.io.StreamCorruptedException: header de secuencia no válido: 3C3F786D"? –

59

Si utiliza Java> = 7, se puede mejorar la solución aceptada utilizando try with resources:

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

Y al revés:

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

se puede hacer por SerializationUtils , serialice el método deserialize & por ApacheUtils para convertir el objeto a byte [] y viceversa, como se indica en @uris answer.

Para convertir un objeto en byte [] serializando:

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

Convertir byte [], para oponerse deserializar ::

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

Haga clic en el enlace para Download org-apache-commons-lang.jar

Integrar .archivo jar haciendo clic en:

Nombre de archivo -> Abrir configuración Medule ->Seleccione su módulo de -> Dependencias ->Añadir archivo Jar y ya está.

Espero que esto ayude.

Cuestiones relacionadas