PDA

View Full Version : Lettura/Scrittura Oggetti in Append


parisisalvo
07-11-2007, 10:56
La scrittura/lettura di oggetti tramite ObjectOutputStream e ObjectInputStream funzionano bene SE il FileOutputStream che definisco ha il flag append = FALSE!
Se il FileOutputStream(F,true) lo dichiaro con modalità di append non funziona più nulla a partire dalla seconda sessione di scrittura!

Es.

Prima sessione di scrittura, sullo stream scrivo 10oggetti.
Chiudo. Apro e leggo: tutto perfetto!

Seconda sessione di scrittura, sullo stream scrivo 5 oggetti.
Chiudo.Apro e leggo: i primi 10 li leggo (appartenenti alla prima sessione), dall'11esimo in poi ho un invalid type code: AC! Sicuramente dovuto all'uso di header all'apertura del file in scrittura.

Tra l'altro mi sono accorto che lui scrive gli oggetti successivi al primo in una forma compatta.
Che metodo posso utilizzare per ovviare a questo problema (gli oggetti che scrivo sono di dimensione variabile).

Io avevo pensato a scrivermi delle librerie mie, con un mio standard del tipo : length data - length data - length data.
La lenght fissa a 5byte (cosi' da avere oggetti di size max a 99999byte e poi subito attaccato l'oggetto.
In lettura avrò quindi un "parser" che legge 5byte fissi, da questi estrae il numero x di byte da leggere e legge i successivi x byte. Dovrebbe funzionare, anche se mi sembra troppo macchinoso!!

andbin
07-11-2007, 11:12
La scrittura/lettura di oggetti tramite ObjectOutputStream e ObjectInputStream funzionano bene SE il FileOutputStream che definisco ha il flag append = FALSE!
Se il FileOutputStream(F,true) lo dichiaro con modalità di append non funziona più nulla a partire dalla seconda sessione di scrittura!Semplicemente la serializzazione NON funziona in append.
Il motivo è semplice: quando inizia il processo di serializzazione viene scritto sullo stream, come prima cosa, un "header" di alcuni byte (se ben ricordo sono 2 byte) che fa appunto da "marcatore". Se poi successivamente apri lo stream in append, tale header viene ovviamente scritto di nuovo.

Il problema è che nella fase di deserializzazione, ad un certo punto si trova con questo header in mezzo ... che non si aspetta e che non ci dovrebbe essere e per tale motivo fallisce.