2009-09-26 10 views
7

Estoy comenzando con la serialización de Java, y no tengo claro cómo se supone que debe obtener objetos de una fuente en un escenario con I/I sin bloqueo O.Java Serializable, ObjectInputstream, E/S sin bloqueo

Toda la documentación que puedo encontrar que sugiere el uso de ObjectInputStream es correcta manera de leer en objetos serializados. Sin embargo, como mencioné, estoy usando java.nio y realizando operaciones sin bloqueo. Si readObject() se bloqueará hasta que haya un nuevo objeto disponible, esto no me puede ayudar

Resumen ... ¿Cómo se hace la serialización cuando se trabaja con Java NIO?

+0

tal vez usted puede usar el método available() si la secuencia para sondear si hay bytes para leer. – clamp

+0

error tipográfico: debería leer "... de la secuencia ..." – clamp

Respuesta

4

Envuelva las instancias serializadas en un protocolo que informe una longitud de carga útil, y la carga útil es la instancia en cuestión. Entonces, una vez que sepa que tiene un segmento que representa una instancia completa, puede usar ObjectInputStream de forma segura sabiendo que no se bloqueará.

Protocolo de la misma familia primeros 32 bits: bits de longitud de carga útil de longitud de carga útil: datos serializados

veces me sorprenden incluso a mí mismo.

+0

Ahora sé por qué las cadenas de Fortran comienzan con el tamaño de la cadena y luego con el contenido.http: //www.ibiblio.org/pub/languages/fortran/ch2-13.html – whatnick

-1

Tendrá que implementar (o encontrar una implementación) un InputStream que se lee desde un búfer al que puede anexar desde otro subproceso.

Parece una cosa bastante extraña de intentar hacer. NIO tiene que ver con el alto rendimiento, y la serialización no.

+0

Estoy usando nio porque encuentro que la interfaz es más fácil de usar cuando se trata de una gran cantidad de transmisiones. El rendimiento no es una preocupación principal. – Mike

-2

Esto es clásico: ¿cómo puedes .read() si no hay nada que leer? NIO es claramente un rendimiento intensivo, dedicado a lograr io no bloqueante. Intenta hacer nio en Socket.read() - aún obtendrás una operación de bloqueo o se te pasará el tiempo de espera ... ninguna cantidad de fantasía hará que los datos aparezcan en el 'puerto' a menos que generes algunos datos ...

final SecureRandom dataGenerator = SecureRandom.getInstance("SHA1PRNG"); 

final Integer range = new Integer('z' - 'a'); 

for (big loop) 
{ 
    buffer.append(dataGenerator.nextInt (range.intValue() + (int) 'a')); 

// ............ 

do.something(buffer.toString()); 

Ahora sus habilidades de desarrollo se mueven, incluso si están en un paso glacial, pero se mueven.

try { 
    // Create a read/writeable file channel 
    File file = new File("filename"); 
    FileChannel channel = new RandomAccessFile(file, "rw").getChannel(); 

    // Create an output stream on the channel 
    OutputStream os = Channels.newOutputStream(channel); 

    // Create an inputstream on the channel 
    InputStream is = Channels.newInputStream(channel); 

    // Close the channel 
    is.close(); 
} catch (IOException e) { 
} 

mensaje edición: capto su respuesta crítica, espera a sus doce mil líneas en CORBA tratar de implementar readObjectNoData() (útil para inicializar objetos deserializados correctamente a pesar de un flujo fuente "hostil" o incompleto)

Se esperaba que mi código de pseudo único proporcionara algún tipo de flujo de datos para decodificar, recargar o lo que fuera, releí su publicación; Creo que dice cómo leer() no bloquear io en un objeto que puede no estar allí ... que profundiza en los problemas conocidos de Excepción y programación, se pone difícil tratando de trabajar esto con alguien que hace la pregunta de la manera usted lo redactó, intente reformularlo y que otros me expliquen qué es lo que está preguntando.

Voy a ir al puesto de tacos en este momento.

+0

No creo que hayas leído mi publicación. Estoy buscando una manera de hacer serialización en una transmisión sin bloqueo. – Mike