PDA

Visualizza la versione completa : [java] sul salvataggio oggetti


YuZzoLo
25-05-2004, 17:50
Originariamente inviato da LeleFT
Se per salvare i dati in un file intendi salvare i tuoi dati in un file di testo (informazioni testuali) puoi appoggiarti alla classe PrintStream (java.io.*)

Se, invece, vuoi salvare oggetti, nel senso che vuoi proprio salvare la struttura dell'oggetto creato, per poterne, in un secondo momento, creare un'altro leggendolo dal file di testo, allora devi documentarti sulla Serializzazione: devi innanzitutto implementare l'interfaccia Serializable (java.io.*) nella classe che vuoi salvare su file e, successivamente, creare un oggetto di tipo ObjectOutputStream e richiamare il relativo metodo writeObject()

Qui hai un esempio di un programma che contiene un oggetto NumeroImmaginario che viene salvato sul file "prova.dat":


import java.io.*;

public class MiaClasse {
public class NumeroImmaginario implements Serializable {
private int a, b;
public NumeroImmaginario(int a, int b) {
this.a = a;
this.b = b;
}
}

private NumeroImmaginario numero;
private ObjectOutputStream oos; // Questo oggetto rappresenta il file

public MiaClasse() {
// Rappresenta l'immaginario (5 + 6i)
numero = new NumeroImmaginario(5, 6);

// Apro (ed eventualmente creo) il file di output
oos = new ObjectOutputStream( new FileOutputStream("prova.dat") );

// Salvo sul file il numero immaginario (come oggetto)
salvaOggetto(numero);
}

private void salvaOggetto(NumeroImmaginario oggetto) {
try {
oos.writeObject(oggetto);
} catch (Exception e) { e.printStackTrace(); }
}

public static void main(String [] args) {
MiaClasse mc = new MiaClasse();
}
}


Ciao. :ciauz:


ho letto qualche topic indietro per cercare risposta... ho trovato questo, ma non ho ancora risolto il problema e i dubbi che ho.


l'ggetto che creo definito in una classe.
il serializable devo metterlo su all'inizio della classe

es: public class MiaClasse implements Serializable

oppure sul costruttore dell'oggetto?

E tale oggetto un array di altri oggetti, e contiene 2 campi di tipo intero.

Devo implementare serializable anche nell'oggetto che contenuto nell'array??? e se si lo devo fare all'inizio della classe che definisce il secondo oggetto(quello dell'array intendo) o nel suo costruttore??


Scusate se son stato contorto ma sono abbastanza principiante in materia.

anx721
25-05-2004, 18:26
public class MiaClasse implements Serializable


e cosi che devi fare;

se MiaClasse ha dei campi, tutti i tipi di tali campi devono esere tipi serializzabili; in particolare i tipi primitivi sono gia tutti serializzabili.

:ciauz:

YuZzoLo
25-05-2004, 18:32
ok tutti i campi sono serializzabili
la classe che contiene l'oggetto serializzabile e anche la classe che contiene l'oggetto che va a farmare un elemento dell'array serializzabile.

nella classe dell'oggetto da salvare ho implementato il metodo

public void serializza(AgendCo agenda) throws Exception{
FileOutputStream out = new FileOutputStream("Agendina.dat");
ObjectOutput s = new ObjectOutputStream(out);
s.writeObject(agenda);
s.flush();
s.close();
out.close();
}


quando lo richiamo dalla classe principale (la main)


agendaz.serializza(agendaz) mi da questo errore

C:\Sun\AppServer\jdk\bin\Agenda.java:127: unreported exception java.lang.Exception; must be caught or declared to be thrown

... da cosa dipende?

YuZzoLo
25-05-2004, 20:09
aggiorno la situazione: ho implementato sia la classe che serializza che quella che deserializza.

e ora veniamo al problema :dh:

se inserisco qualcosa nel mio oggetto e poi salvo mi da un eccezione:

java.io.NotSerialiZableExeption : java.io.BufferedReader


e quando chiudo e riapro ho errori in fase di deserializzazione del tipo

java.io.WriteAbortException: writing aborted; java.io.NotSerialiZableExeption : java.io.BufferedReader


mi viene in mente da novello che la BufferedReader non sia serializzabile, il che mi creerebbe mmmmmmmmmmmmmmmmoooooooooooltissimi problemi...

anche perch ho usato quella classe molto spesso nel codice.


:bh: :cry: :cry:

anx721
25-05-2004, 20:23
Nella documentazione non dice che BufferedReader implementa Serializable, il problema quindi nasce se se nella tua classe usi un campo di tipo BufferedReader; se cosi, probabilmente il problema puo essere risolto utuilizzando il modificatore transient per tale campo, ad esempio:

transiet BufferedReader buf;

In questo modo tale campo non viene serializzato; nel momento in cui deserializzi devi preoccuparti di reistanziare tale campo opportunamente.

:ciauz:

YuZzoLo
26-05-2004, 11:39
Originariamente inviato da anx721
Nella documentazione non dice che BufferedReader implementa Serializable, il problema quindi nasce se se nella tua classe usi un campo di tipo BufferedReader; se cosi, probabilmente il problema puo essere risolto utuilizzando il modificatore transient per tale campo, ad esempio:

transiet BufferedReader buf;

In questo modo tale campo non viene serializzato; nel momento in cui deserializzi devi preoccuparti di reistanziare tale campo opportunamente.

:ciauz:


si infatti, usavo un campo di tipo buffereader, ora col transient funziona tutto.


Grazie mille dell'aiuto!
Troppo gentile :)

Loading