Newsgroup: it.comp.java
Titolo: Un problema con la serializzazione

Sto cercando di salvare su disco una classe che contiene alcune informazioni
di interesse, quindi ho deciso di utilizzare il metodo writeObject della
classe ObjectOutputStream. Chiaramente la classe in questione č
serializzabile, e sto provando a salvarla sul disco utilizzando il seguente
metodo :
public void saveToDisk(File destination, MyObject object) {
	ObjectOutputStream writer = null;
        try {      
            OutputStream fileOutput = new FileOutputStream(destination);
            writer = new ObjectOutputStream(fileOutput);
            writer.writeObject(object);
            writer.flush();  
        }
        catch (Exception ioException) {
            ioException.printStackTrace();
        }
        finally {
            try {
                writer.close();
            }
            catch (IOException ioCloseException) {
                ioCloseException.printStackTrace();
            }
        }
}
Quando vado ad invocare questo metodo viene sollevata questa eccezione :
java.io.IOException: Handle non valido
    at java.io.FileOutputStream.writeBytes(Native Method)
    at java.io.FileOutputStream.write(FileOutputStream.java:260)
    at
java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.j
ava:1639)
    at
java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOut
putStream.java:1548)
    at
java.io.ObjectOutputStream.writeNonProxyDesc(ObjectOutputStream.java:1146)
    at
java.io.ObjectOutputStream.writeClassDesc(ObjectOutputStream.java:1100)
    at
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1241)
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
    at
java.io.ObjectOutputStream.writeFatalException(ObjectOutputStream.java:1355)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:281)
.............
.............
Qualcuno saprebbe dirmi dove sbaglio ??? Sono sicuro che l'oggetto che cerco
di memorizzare sul disco č serializzabile, anche perché lo utilizzo per
scambiare dei dati mediante RMI, ma non sono riuscito a capire il perché di
questo errore !! Poiché ho visto che si tratta di un errore a livello di
codice nativo, vi fornisco le caratteristiche degli ambienti sui quali ho
provato questo codice :
	Sistemi Operativi : Windows 2000 SP4, Windows XP Professional SP1
	JDK : 1.4.2
Vi ringrazio per il vostro aiuto, Claudio
-- 
________________________________________________
Se c'č soluzione perché ti preoccupi ??
Se non c'é soluzione perché ti preoccupi ???
________________________________________________

 Sistemi Operativi : Windows 2000 SP4, Windows XP Professional SP1 JDK : 1.4.2
idem
Marco
-- 
reply: remove .duh.spam
http://cthulhu.fastmail.fm

 Io ho provato con un oggetto di tipo String e non mi da nessun errore..
Anche a me funge. (w2k j2se1.4.2_02)
Forse dipende dal File che gli passi?
Inviato da 
www.mynewsgate.net

 
Non credo, perché il file non esiste ed infatti non ha problemi a crearlo,
il problema sorge quando inizia la serializzazione con il metodo
writeObject(). La cosa buffa è che l'errore non si verifica sempre allo
stesso punto : talvolta all'inizio, altre volte dopo aver scritto 2,7 KB ed
un'altra dopo 5,13 KB.
Però sono sicuro che la classe MyObject è serializzabile, perché utilizzando
una socket riesco a trasferirla....non so forse conoscete qualche bug
relativo una situazione del genere ?? 
Grazie, Claudio
________________________________________________
Se c'è soluzione perché ti preoccupi ??


 java.io.IOException: Handle non valido
è in italiano.. l'hai tradotto tu o è il msg di una tua eccezione? Qual'è il 
messaggio della eccezione originale?


 
Non l'ho tradotto, il messaggio è proprio quello che ho riportato. Forse,
poiché si tratta di un errore a livello di codice nativo, è dovuto alla
lingua del Sistema Operativo


 lingua del Sistema Operativo
Evidente.. %-)
Non so... sarà dura trovare la causa...non penso cmq che l'errore sia nel codice.
Ho fatto una ricerca sul sito della sun con keyword "The handle is invalid" e ho 
trovato diversi esempietti che danno il tuo stesso errore ad un singolo e vanno 
a tutti gli altri...
Di solito a questo punto si adottano soluzioni estreme... :P
Con cosa lo compili il programma? Tramite un IDE? Se si, hai gia provato a 
compilarlo direttamente da shell con javac?
Hai provato con un altra versione del jdk(1.4.2_03)?
Ti sei gia fatto un cuba libre? :)
Non mi viene in mente niente altro...


 Non so... sarà dura trovare la causa...non penso cmq che l'errore sia nel >
codice.
Mi sono messo a fare una sorta di debug per individuare l'errore : la
classe MyObject ha una serie di campi, alcuni rappresentati da classi
standard (come String) o tipi primitivi(come long, double), ed altri da
classi create da me.
Supponiamo che quest'ultime si chiamino FirstObject, SecondObject,
GreatObject, LittleObject e VeryLitteObject...chiaramente tutte
implementano Serializable (e non potrebbe essere altrimenti perché, come
detto le utilizzo in un'applicazione RMI e va tutto bene).
FirstObject e SecondObject sono delle classi non composte, mentre
LittleObject contiene una lista di VeryLittleObject e GreatObject una
lista di LittleObject. Se vado a serializzare GreatObject e FirstObject va
tutto bene, viene invece sollevata l'eccezione se provo a serializzare
SecondObject.
A parte quest'ultimo particolare....perché se serializzo "a pezzi" va
tutto bene e se serializzo tutto insieme no ??? Secondo te è tutto
riconducibile all'errore causato da SecondObject ??
Grazie per l'aiuto e per le tue opinioni, Claudio
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 riconducibile all'errore causato da SecondObject ??
La classe File incapsula un file handle. "Handle non valido" significa che 
per qualche ragione il file viene chiuso. 
Per curiosita', qualche tua classe ha i metodi writeObject/readObject?
-- 
You dont know what to do when you dont know what you're doing.
http://space.tin.it/computer/csadun

 Per curiosita', qualche tua classe ha i metodi writeObject/readObject?
No, nessuna. L'unica cosa un po' particolare da segnalare (anche se
secondo me è ininfluente) è che la classe SecondObject ha un costruttore
che prevede come argomento un oggetto javax.print.PrintService
A proposito....facendo varie prove ho constatao che talvolta anche la
classe GreatObject solleva la solita eccezione


som...@somewhere.org
 (Claudio Di Vita) wrote in
news:brploh$v0$
1...@news.newsland.it
: 
Hmm.. magari serializzi oggetti che contegono streams aperti?
Senza codice si puo' andare solo a tentativi :)


 Senza codice si puo' andare solo a tentativi :)
Grazie del consiglio, adesso faro un controllo approfondito. Però voglio
chiederti una cosa. Ho questa situazione :
        GreatObject
        +
        + Lista LitteObject
                +
                + String x
                +
                + String y
                +
                + Lista VeryLittleObject
                        +
                        + String j
                        +
                        + String k
Perchè se serializzo la lista di LitteObject va tutto bene, mentre se
serializzo GreatObject viene sollevata un'eccezione ???
GreatObject è una classe astratta ed ha solamente un
metodo,getLittleObjects, che restituisce la lista di LittleObject. Tra
l'altro quando serializzo la lista di LitteObject utilizzo proprio il
metodo che ti ho detto !!!


Forse sono riuscito a capire le motivazioni di questo errore.
Per costruire l'oggetto GreatObject devo fare ricorso a delle porzioni di
codice nativo (che non ho scritto io, magari sapessi farlo) che accedono
al registro di sistema di Windows.
Poiché il registro di sistema di Windows è memorizzato su file, magari
vengono aperti degli stream che poi non vengono richiusi...il che si
ripercuote (anche se non riesco a capire come) sulla procedura di
serializzazione dei miei oggetti. Sembra che chiamando il Garbage
Collector dopo aver avuto acesso al Registro di sistema risolva il mio
problema.
Probabilmente ho detto qualche ç°§*?^$°$, quindi se avete altre opinioni.
Grazie dell'aiuto, Claudio
P.S.
Se siete interessati alla libreria per l'accesso al Registro di sitema di
Windows, potete trovarla all'indirizzo :
http://www.trustice.com/java/jnireg/index.shtml
