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?
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?
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
}
}
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
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. –
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
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>
y más formas mencionadas here
Alternativamente, toda la colección puede ser importado. Consulte this link
¿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
Esto es simple y directo a diferencia del 99% de las otras respuestas que hay sobre esta pregunta exacta. –
Utilicé su respuesta, uris, y no puedo entender por qué recibo "java.io.StreamCorruptedException: header de secuencia no válido: 3C3F786D"? –
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();
}
}
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.
¿Por qué como 'byte []'? ¿Por qué no simplemente escribirlo directamente en el socket con 'ObjectOutputStream', y leerlo con' ObjectInputStream'? – EJP
@wuhaochi ¿Realmente * necesita un ejemplo de 'ObjectOutputStream.writeObject()' y 'ObiectInputStream.readObject()'? – EJP