PDA

View Full Version : [JAVA]Serializzare e deserializzare un oggetto


MEMon
04-07-2006, 16:08
Ciao a tutti, ho creato una classe per gestire i file che creo per tenere in memoria dei dati.
La classe è questa:
import java.io.*;

public class GestioneFileDati {

FileOutputStream fo=null;
FileInputStream fi=null;

public GestioneFileDati(String path){
try{
fo=new FileOutputStream(path);
fi=new FileInputStream(path);
}
catch(IOException e){
System.out.println("Impossibile aprire il file di dati: "+e);
}
}

public void salva(Object obj){
try{
ObjectOutputStream os=new ObjectOutputStream(fo);
os.writeObject(obj);
os.flush();
os.close();
}
catch(IOException e){
System.out.println("Impossibile salvare i dati: "+e);
}
}

public Object carica(){
Object obj=null;
try{
ObjectInputStream is=new ObjectInputStream(fi);
obj=is.readObject();
is.close();
}
catch(IOException e){
System.out.println("Impossibile caricare i dati: "+e);
}
catch(ClassNotFoundException e){
System.err.println();
}
return obj;
}

public void cambiaFile(String path){
try{
fo=new FileOutputStream(path);
fi=new FileInputStream(path);
}
catch(IOException e){
System.out.println("Impossibile aprire il file di dati: "+e);
}
}
}
C'è un problema, anche se mi sembra che salvi correttamente un oggetto, al momento di ricaricaricarlo mi da l'errore Impossibile caricare il file di dati: java.io.EOFException e se vado a vadere il file che conteneva l'oggetto appare vuoto(sembra che cancelli il contenuto)...ovviamente dopo il salvataggio ero pieno, 4 kbytes.

Questa classe la uso in questo modo:
PER SALVARE...
DatiGiocatore dg=new DatiGiocatore();
GestioneFileDati file=new GestioneFileDati("C:/imm/Data/Giocatore.dat");

public Ambiente(Container cnt){
int[] array={25,4,3,5};
dg.animazione(array);
file.salva(dg);
}

...E PER CARICARE
DatiGiocatore dg=new DatiGiocatore();
GestioneFileDati file=new GestioneFileDati("C:/imm/Data/Giocatore.dat");

public Ambiente(Container cnt){
dg=(DatiGiocatore)file.carica();
System.out.println(dg.animazioe());
}
Dove sbaglio?

Andlea
04-07-2006, 16:23
ad una prima occhiata sembra corretto
L'oggetto che salvi implementa Serializable, vero?

MEMon
04-07-2006, 16:26
Si certo, per sicurezza metto la classe anche dell'oggetto non si sa mai che sia sbagliato quello:
import java.io.*;

public class DatiGiocatore implements Serializable{

int[] animazione=new int[4]; //totoali,ultimo,salto,abb.

public DatiGiocatore(){
}

public void animazione(int[] amz){
animazione=amz;
}

public int[] animazione(){
return animazione;
}
}

franksisca
04-07-2006, 17:13
scusa, potresti postare correttamente il codice dell'errore, perchè non capisco se l'errore lo dà quando crei il fi=new FileInputStream(path); oppurepublic Object carica()

da quello che dici dovrebbe essere qui:fi=new FileInputStream(path);
e non dovrebbe darti errore di fine file, che potrebbe invece darti quando legge.......aspettiamo :)

MEMon
04-07-2006, 17:19
Ciao,
L'errore me lo da il meotodo pubblic Object carica(), infatti viene sollevata questa eccezzione
catch(IOException e){
System.out.println("Impossibile caricare i dati: "+e);
}

E stampato "Impossibile caricare i dati: java.io.EOFException".

MEMon
04-07-2006, 17:21
EOFException suona come un end of file exception, am non capisco come possa esserci un problema sull'end of file...

franksisca
04-07-2006, 17:35
per curiosità, metti una riga vuota alla fine del file, per curiosità, e vedi se dà lo stesso errore.....

MEMon
04-07-2006, 17:45
Ma intendi dopo che l'ho salvato?

MEMon
04-07-2006, 17:48
Dopo che lo salvo il file Giocatore.dat contiene questo:
"’ sr
DatiGiocatoreöÊXÇ”:0 [
animazionet [Ixpur [IMº`&vê²¥ xp     "

Tutto quello tra "".
Il fatto è che scompare e diventa vuoto quando provo a caricarlo.
Dove metto la riga vuota?

franksisca
04-07-2006, 18:22
Alla fine del file in cui salvi.

MEMon
04-07-2006, 18:26
Ma cosa intendi per riga vuota? io ho messo una riga premendo invio e poi ho messo uno spazio, ma l'errore rimane...

...lo sapevo che avevo le streghe nel computer :cry:

franksisca
04-07-2006, 18:40
prova a fare così:public DatiGiocatore carica(){
DatiGiocatore obj=null;
try{
ObjectInputStream is=new ObjectInputStream(fi);
obj=(DatiGiocatore )is.readObject();
is.close();
}
catch(IOException e){
System.out.println("Impossibile caricare i dati: "+e);
}
catch(ClassNotFoundException e){
System.err.println();
}
return obj;
}

magari vuole il casting, anche se mi sembra una cosa alquanto strana......

MEMon
04-07-2006, 18:43
Stesso errore anche così, ho provato invece così:
public Object carica(){
Object obj=null;
try{
fi=new FileInputStream(path);
is=new ObjectInputStream(fi);
obj=is.readObject();
is.close();
}
catch(IOException e){
System.out.println("Impossibile caricare i dati: "+e);
}
catch(ClassNotFoundException e){
System.err.println();
}
return obj;
}
E non da più errore, ma ho provato a stampare l'array animazione non corrpisonde...contiene dei caratteri strani.

MEMon
04-07-2006, 18:48
Mi correggo con l'ultimo metodo funziona alla perfezione, comunque è parecchio strano la modifica che ho fatto è praticamente inutile credo...bho.
Grazie per la pazienza!!!