Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    104

    [java] sul salvataggio oggetti

    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":
    codice:
    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.

    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.

  2. #2
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    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.


  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    104
    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?

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    104
    aggiorno la situazione: ho implementato sia la classe che serializza che quella che deserializza.

    e ora veniamo al problema

    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.



  5. #5
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    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.


  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    104
    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.


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


    Grazie mille dell'aiuto!
    Troppo gentile

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.