2009-09-26 18 views
7

Sono appena iniziato con la serializzazione Java e non sono chiaro su come si suppone di ottenere oggetti da un'origine in uno scenario con I/I non bloccante O.Java serializzabile, ObjectInputstream, I/O non bloccante

Tutta la documentazione che riesco a trovare suggerisce l'utilizzo di ObjectInputStream è il modo corretto per da leggere in oggetti serializzati. Tuttavia, come ho detto, sto usando java.nio e sto eseguendo operazioni non di blocco. Se readObject() verrà bloccato fino a quando non sarà disponibile un nuovo oggetto, questo non può essere d'aiuto

Riassunto .. Come si esegue la serializzazione quando si lavora con Java NIO?

+0

forse è possibile utilizzare il metodo available() se il flusso da interrogare se ci sono byte da leggere. – clamp

+0

typo: che dovrebbe ovviamente leggere "... del flusso .." – clamp

risposta

4

Avvolgere le istanze serializzate in un protocollo che riporta una lunghezza del payload e il carico utile è l'istanza in questione. Quindi, una volta che sai di avere un segmento che rappresenta un'istanza completa, puoi utilizzare ObjectInputStream sicuro sapendo che non bloccherà.

protocollo come questo primi 32 bit: lunghezza Payload Payload bit di lunghezza: dati serializzati

A volte mi stupire anche me stesso.

+0

Ora so perché le stringhe fortran iniziano con la dimensione della stringa, quindi content.http: //www.ibiblio.org/pub/languages/fortran/ch2-13.html – whatnick

-1

Sarà necessario implementare (o trovare un'implementazione) di uno InputStream che legge da un buffer che è possibile aggiungere da un altro thread.

Sembra una cosa piuttosto strana da provare. NIO si basa su prestazioni elevate e la serializzazione non lo è.

+0

Sto usando nio perché ho trovato l'interfaccia più facile da lavorare quando si tratta di un gran numero di flussi. Le prestazioni non sono una preoccupazione primaria. – Mike

-2

Questo è un classico: come si può leggere() se non c'è nulla da leggere? NIO è chiaramente ad alte prestazioni, dedicato al raggiungimento di un io non bloccante. Provare a fare nio su Socket.read() - si otterrà comunque un'operazione di blocco o di caduta del timeout ... nessuna quantità di fantasia farà apparire i dati sulla 'porta' a meno che non si generino alcuni dati ...

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()); 

Ora le tue abilità di sviluppo si spostano, anche se a un ritmo glaciale ma si muovono.

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) { 
} 

messaggio Modifica: afferro la tua risposta critica, aspettare che i tuoi dodicimila linee in CORBA cercando di attuare readObjectNoData() (utile per l'inizializzazione degli oggetti deserializzate correttamente nonostante un flusso di fonti "ostile" o incompleta)

Il mio unico codice psuedo prevedeva una sorta di flusso di dati da decodificare, ricaricare o qualsiasi altra cosa - rileggo il tuo post; Penso che dica come leggere() non bloccare l'io su un oggetto che potrebbe non esserci ... che approfondisce profondamente i noti problemi di Eccezione e programmazione, diventa rischioso di provare a farlo funzionare con qualcuno che pone la domanda nel modo lo hai formulato, prova a riformulare e ad altri mi spieghi che cosa stai chiedendo.

Andrò al banco dei taco proprio al momento.

+0

Non penso che tu abbia letto il mio post. Sto cercando un modo per fare la serializzazione su un flusso non bloccante. – Mike