Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    42

    [JAVA] ArrayList Vuote quando deserializzo oggetto

    Nel mio codice ho una classe Database che contiene 2 arraylist di oggetti motore e componenti.
    Quando creo un oggetto di tipo Database e lo serializzano su un file, al momento deserializzazione Le arraylist sono vuote (Se inserirsi altri attributi questi verrebbero
    deserializzati correttamente). Se invece provo a serializzare Un arraylist Al momento della deserializzazione Questa contiene effettivamente gli oggetti aggiunti.
    In entrambi i casi le arraylist vengono correttamente riempite, infatti si approva stampare un elenco degli oggetti contenuti questo ritorna esattamente questi ultimi.
    Vi scrivo un po' di codice

    codice:
    public class Database implements Serializable {
    
    
        private static final long serialVersionUID = 1L;
        
         static final String nomefile = "save.s"; 
        
    
    
        static String S = "stringa prova";
         static ArrayList<Motore> motori=new ArrayList <Motore>();
         static ArrayList<Componente> componenti= new ArrayList<Componente> ();
    
    public  void save() {
             
            
            FileOutputStream fos=null;
            ObjectOutputStream oos=null;
            try {
                fos = new FileOutputStream(nomefile);
                oos = new ObjectOutputStream(fos);
                oos.writeObject(this);
                
                
                System.out.println("database correttamente salvato.");
            } catch (IOException e) {
                e.printStackTrace();
            }
            
            finally
            {
                try{
                    if (oos != null)
                        oos.flush();
                        oos.close();
                    if (fos != null)
                        fos.close();
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
    public static Database load() throws IOException {
            FileInputStream fis = null;
            ObjectInputStream ois = null;
            Database db = null;
    
    
    
    
            try {
                
                fis = new FileInputStream(nomefile);
                ois = new ObjectInputStream(fis);
                db = (Database) ois.readObject();
                
                return db;
            } catch (ClassNotFoundException | IOException e) {
                e.printStackTrace();
            }
            finally
            {
                if (ois != null)
                    ois.close();
                if (fis != null)
                    fis.close();
                
            }
            return db;
                
            
        }
    }
    Due classi distinte Componente e Motore Praticamente uguali (per farvi capire, in realtà sono diverse)
    codice:
    public class Componente/Motore implements Serializable {
        
        private String nome;        
                
        public Componente/Motore(String nomef){
            this.nome = nome;
            Database.componenti/motori.add(this);
    
    
        }
    }
    codice:
    public class Test{
        private static Database database ;
    
            Motore M1 = new Motore("motore1");
            Motore M2 = new Motore("motore2");
            Componente C1 = new Componente("componente1");
            Componente C2 = new Componente("componente2");
            Componente C3 = new Componente("componente3");
            Componente C4 = new Componente("componente4");
    
            database.save();
    }
    Ora, se provo a scrivere

    codice:
    public class Test{
        private static Database database ;
    
        /*    Motore M1 = new Motore("motore1");
         *    Motore M2 = new Motore("motore2");
         *    Componente C1 = new Componente("componente1");
         *    Componente C2 = new Componente("componente2");
         *    Componente C3 = new Componente("componente3");
         *    Componente C4 = new Componente("componente4");
    
         *    database.save();
         */    Database.load();
    
    
    }
    Le arraylist sono vuote ma la String "stringa prova" è stata deserializzata correttamente...
    Ci sto sbattendo la testa da una settimana, non capisco proprio...

    Spero possiate aiutarmi
    Ultima modifica di MBdip; 28-04-2014 a 11:03

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da MBdip Visualizza il messaggio
    Nel mio codice ho una classe Database che contiene 2 arraylist di oggetti motore e componenti.
    Quando creo un oggetto di tipo Database e lo serializzano su un file, al momento deserializzazione Le arraylist sono vuote

    codice:
         static ArrayList<Motore> motori=new ArrayList <Motore>();
         static ArrayList<Componente> componenti= new ArrayList<Componente> ();
    Le variabili sono static. La serializzazione degli oggetti non prende in considerazione campi di classe (static) ma solo della istanza.

    Perché hai voluto/dovuto metterli static .... non lo so (non ho analizzato tutto il codice postato). Rivedi questo aspetto, comunque.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    42
    Beh, Li ho messi static per fare in modo che ogni database condividesse le stesse arraylist… anche la stringa di prova È static, Però quella viene deserializzata correttamente...
    E come ho scritto anche se provo a serializzare La arraylist singolarmente, funziona bene. Forse perché non viene considerato come campo static di un oggetto....
    Mi risulta molto comodo che le arraylist siano static Per avere una sola arraylist condivisa, di modo che anche gli eventuali metodi di altre classi lavorino sulla stessa arraylist...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da MBdip Visualizza il messaggio
    anche la stringa di prova È static, Però quella viene deserializzata correttamente...
    La stringa di prova S non viene né serializzata né di conseguenza deserializzata ... essendo static. È inizializzata con un valore costante .... e quello semplicemente rimane lì.

    Quote Originariamente inviata da MBdip Visualizza il messaggio
    Forse perché non viene considerato come campo static di un oggetto....
    L'ho spiegato prima .... "La serializzazione degli oggetti non prende in considerazione campi di classe (static)".

    Quote Originariamente inviata da MBdip Visualizza il messaggio
    Mi risulta molto comodo che le arraylist siano static Per avere una sola arraylist condivisa, di modo che anche gli eventuali metodi di altre classi lavorino sulla stessa arraylist...
    In ogni caso il tuo "design" è dubbio .... perlomeno fa un "po' acqua" ...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    42
    Quote Originariamente inviata da andbin Visualizza il messaggio
    In ogni caso il tuo "design" è dubbio .... perlomeno fa un "po' acqua" ...
    In che senso?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da MBdip Visualizza il messaggio
    In che senso?
    Innanzitutto perché dovresti serializzare oggetti Database? Per quanto vedo dal codice postato, Database non ha "stato" (si intende genericamente l'insieme degli "attributi" (variabili di istanza) che contengono i dati distinti per ciascun oggetto). Domandati: quale è (o dovrebbe essere) secondo te la differenza tra due (o più) distinti oggetti Database?

    Inoltre anche fare in altre classi es.:
    Database.componenti.add(this);

    non è un buon "design".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    42
    Allora, ti spiego…
    Io ho dei motori, dei componenti delle macchine che hanno un loro stato, con i propri metodi e quant'altro.
    Devo salvare tutto in un unico file.
    Allora ho pensato: per avere tutti gli elementi raggruppati creo Degli archivi.
    Allora ho creato ArchivioComponenti ArchivioMotori ArchivioMacchine, ed ognuno di questi contiene le arraylist dei corrispettivi oggetti. In queste classi c'è il metodo per aggiungere l'oggetto alla lista.
    Dopo di che ho pensato di raggruppare le arraylist in un database Da salvare in un file… Ovviamente nel mio codice non c'è Database.componenti.add(this); Ma un metodo equivalente nell'archivio dell'oggetto.
    Siccome le arraylist sono uniche, ho deciso di renderle static (non ci sono due arraylist di componenti o motori).
    Fa così tanta acqua questo design?
    Come altro potrei implementare?


    Ultima modifica di MBdip; 28-04-2014 a 15:47

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da MBdip Visualizza il messaggio
    Io ho dei motori, dei componenti delle macchine che hanno un loro stato, con i propri metodi e quant'altro.
    Devo salvare tutto in un unico file.
    Quindi la tua "base dati" è composta da un solo file che contiene oggetti serializzati. All'avvio della applicazione (o appena necessario), leggi tutti gli oggetti, poi l'applicazione lavora con questi dati e alla terminazione della applicazione (o in qualunque altro momento) gli oggetti possono essere salvati su file.
    Corretto? Se così, ok.

    Quote Originariamente inviata da MBdip Visualizza il messaggio
    Allora ho pensato: per avere tutti gli elementi raggruppati creo Degli archivi.
    Allora ho creato ArchivioComponenti ArchivioMotori ArchivioMacchine, ed ognuno di questi contiene le arraylist dei corrispettivi oggetti. In queste classi c'è il metodo per aggiungere l'oggetto alla lista.
    Ma nella classe Database vuoi mettere le liste "crude" cioè proprio List<X> o questi archivi di cui parli adesso cioè es. ArchivioComponenti ecc...?

    Quote Originariamente inviata da MBdip Visualizza il messaggio
    Come altro potrei implementare?
    Supponendo che hai fatto queste classi ArchivioComponenti, ArchivioMotori, ... in cui ciascuna incapsula e nasconde la lista, offrendo però i metodi per gestirla, innanzitutto puoi mettere questi oggetti come campi di istanza di Database. Chiaramente sia Database, sia le classi di archivio, sia le classi degli oggetti (es. Motore) devono essere serializzabili.
    A quel punto Database è tranquillamente serializzabile e con i dati al posto giusto.

    Database potrebbe tecnicamente anche avere i metodi per load/save. Però in linea di massima sarebbe preferibile separare la logica di I/O in una classe separata es. DatabaseFile. Sarebbe più pulito e flessibile.

    In modo da poter fare, immaginiamo ora, un codice del genere:

    codice:
    DatabaseFile dbfile = new DatabaseFile("file.xyz");
    Database db = dbfile.load();
    ......
    dbfile.save(db);
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2014
    Messaggi
    42
    il codice:
    codice:
    Database db = Database.load();
    sarebbe scorretto?

    effettvamente C'è qualcosa che non va nel mio codice…
    Cioè, carico il database all'interno di una classe che serve di visualizzare un menu (obbrobrio) istanziando un oggetto Database db, Per aggiungere un componente alla lista, Nella classe Componenti nel costruttore chiamo il metodo in questo modo:

    codice:
    menu.db.get_ArchivioComponenti().addComponenti (this);
    ma credo fortemente ci sia qualcosa che non va

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da MBdip Visualizza il messaggio
    il codice:
    codice:
    Database db = Database.load();
    sarebbe scorretto?
    Tecnicamente, di per sé, no. Ma sarebbe poco "object-oriented". Oltre al fatto che se load/save sono in Database, allora Database ha 2 responsabilità principali: "modellare" il database e fare I/O. Quindi sicuramente meno bello dal punto di vista del design.

    Quote Originariamente inviata da MBdip Visualizza il messaggio
    Nella classe Componenti nel costruttore chiamo il metodo in questo modo:

    codice:
    menu.db.get_ArchivioComponenti().addComponenti (this);
    Mi spiace ma è davvero un brutto design che una classe Componente (qualunque entità rappresenti .. non lo so) debba "sapere" del DB e che vada ad aggiungere sé stesso alla base dati.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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 © 2025 vBulletin Solutions, Inc. All rights reserved.