Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di Relais
    Registrato dal
    Sep 2011
    Messaggi
    19

    Problema con la serializzazione

    Dovrei fare un programmino in java che, oltre a fare altre cose, dovrebbe anche salvarmi i dati di una tabella in un file per poi ricaricarli. Bene ok decido di usare la serializzazione\deserializzazione dell'oggetto in questione faccio tutto come mi hanno insegnato ma qualcosa non va nella deserializzazione perchè quando schiaccio il bottone per serializzare lo fa tranquillamente (crea il file e ci mette dentro l'oggetto serializzato) ma quando poi schiaccio il bottone per deserializzare l'oggetto per poi aggiornare la tabella non va, l'oggetto rimane "null" e non capisco cosa non va perchè ho fatto tutto bene!

    Vi riporto il codice interessato!

    Questo è il codice dell'evento del bottone per quando serializzo l'oggetto:
    codice:
    else if(e.getSource() == save) { 
    int returnVal = fc.showSaveDialog(this); 
    if (returnVal == JFileChooser.APPROVE_OPTION) { 
    File f = fc.getSelectedFile(); 
    try { 
    FileFactory.writeObject(f,ris); 
    } 
    catch(IOException ee) {txt.setText("Numero 1 save: " + ee);}  } }
    Questo invece è l'evento del bottone che dovrebbe deserializzare l'oggetto dal file e aggiornare la tabella:
    codice:
    else if (e.getSource() == load) {
    			   int returnVal = fc.showOpenDialog(this);
    		        if (returnVal == JFileChooser.APPROVE_OPTION) {
    		        	File f = fc.getSelectedFile();
    		        	ObjectInputStream oos = null;
    		        	try {
    		      		  FileInputStream fos = new FileInputStream(f);
    		    		  oos = new ObjectInputStream(fos);
    		    		  
    		        	}
    		        	catch(IOException ee) {txt.setText("Numero 1: " + ee);}
    		        	try {
    		        		ris = (ArchivioRisultati) oos.readObject();
    		        		oos.close();
    		        	}
    		        	catch(IOException ee) {txt.setText("Numero 2: " + ee);}
    		        	catch(ClassNotFoundException ee) {txt.setText("Numero 3: " + ee);}
    		        	//FileFactory.setFileContent(f, content);
    		        	//txt.setText("Numero Matchati: " + ris.numMatched());
    		        	tab.setModel(new MyTableModel(ris));
    		        }
    		   }
    Mentre la classe ArchivioRisultati è questa:
    codice:
    import java.io.*;
    
    import java.util.*;
    
    
    
    
    
    public class ArchivioRisultati implements Serializable{
    	
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	private Vector<Risultati> lista = new Vector<Risultati>();
    
    	
    	
    	public ArchivioRisultati() {
    		//super();
    	}
    	
    	
    	
    	public void add(Risultati p) {
    		lista.add(p);
    	}
    	
    	public Risultati getRisultati(int n) {
    		return lista.elementAt(n);
    	}
    	
    	public int numMatched() {
    		return lista.size();
    	}
    	
    	public void clear() {
    		lista.clear();
    	}
    
    }
    La classe Risultati è questa:
    codice:
    import java.io.Serializable;
    
    
    public class Risultati implements Serializable{
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	private String nomeFile; 
    	private String stringaTrovata;
    	private String stringaRimpiazzata;
    	private int position;
    	
    	public Risultati() {
    		this.nomeFile = null;
    		stringaTrovata = null;
    		stringaRimpiazzata = null;
    		position = 0;
    	}
    	
    	public Risultati(String file,String find,String replace, int pos) {
    		this.nomeFile = file;
    		stringaTrovata = find;
    		stringaRimpiazzata = replace;
    		position = pos;
    	}
    	
    	public String getNomeFile() {return nomeFile;}
    	
    	public String getStringaTrovata() {return stringaTrovata;}
    	
    	public String getStringaRimpiazzata() {return stringaRimpiazzata;}
    	
    	public int getPosition() {return position;}
    }
    SONO VERAMENTE DISPERATO!!!

  2. #2
    Utente di HTML.it L'avatar di Relais
    Registrato dal
    Sep 2011
    Messaggi
    19
    UP vi prego aiutatemi non riesco a trovare il problema!

  3. #3
    controlla con il DEBUG....
    mi spiace ma di più non ti so dire...non so niente di serializzazione e deserializzazione
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Verifica se viene lanciata qualche eccezione, senza ammazzarle, ovvero facendone stampare lo stackTrace:

    codice:
    try {
       ...
    } catch (Exception e) {
       e.printStackTrace();
    }
    (ovviamente, lanciando poi l'applicazione da riga di comando, in modo da vedere la console di output)

    Così, ad occhio, non mi sembra ci siano problemi: le tue classi ArchivioRisultati e Risultati implementano entrambe Serializable e non hanno altri tipi di oggetti non serializzabili (cosa che avrebbe prodotto un'eccezione in fase di serializzazione).

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it L'avatar di Relais
    Registrato dal
    Sep 2011
    Messaggi
    19
    Sono un po' alle prime armi con Java e sto usando windows quindi non so come compilarlo su terminale qua si windows

    Non capisco veramente l'errore sto andando in tilt

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Relais
    Sono un po' alle prime armi con Java e sto usando windows quindi non so come compilarlo su terminale qua si windows

    Non capisco veramente l'errore sto andando in tilt
    Io non ho parlato di "compilare", ma di eseguire.
    E' una differenza che deve essere ben chiara fin da subito, altrimenti si va solo per tentativi.

    Compilazione: trasformazione del codice sorgente in codice "compilato" (creazione dei file .class ed, eventualmente, packaging in un file .jar).

    Esecuzione: lo dice il nome stesso, esecuzione del programma compilato.

    La compilazione la puoi fare benissimo dal tuo IDE (anche se bisognerebbe essere in grado di farlo a mano, usando gli strumenti della JDK, ovvero il compilatore "javac").

    L'esecuzione andrebbe fatta a mano: si apre un prompt dei comandi, ci si sposta nella cartella dove c'è il file JAR (perchè, se stai usando un IDE sicuramente questo ti crea il JAR), e lo si lancia con il seguente comando:

    codice:
    java -jar NomeDelFileJar.jar
    Tutte queste cose sono spiegate a pagina 5 (dopo la copertina, la prefazione, l'indice e l'introduzione) di un qualunque libro di programmazione Java e si danno assolutamente per scontate, acquisite e assolutamente maneggiate quando si vede del codice che parla di serializzazione...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it L'avatar di Relais
    Registrato dal
    Sep 2011
    Messaggi
    19
    Ok scusa comunque perchè ero abituato con Linux e su windows lo eseguo direttamente con eclipse, comunque ho fatto e su terminale non mi stampa niente! Quindi vuol dire che non solleva alcun tipo di eccezione e dovrebbe andare! Ma solo a me succedono sti misteri? Sono 3 giorni che ci sbatto la testa! :s

    (Scusa a volte confondo compilazione e esecuzione senza manco accorgemene ma lo so la differenza xD)

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ho usato le tue classi (così come le hai postate, fatto copia ed incolla e aggiunto gli import che hai tralasciato perchè ovvi).

    Questa la classe di test che ho usato:
    codice:
    import java.io.*;
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    
    public class Test extends JFrame implements ActionListener {
       private JButton cmdSerializza;
       private JButton cmdDeserializza;
       private JPanel jpCentrale;
    
       private ArchivioRisultati archivio;
    
       public Test() {
          Container c = getContentPane();
          c.setLayout( new BorderLayout() );
    
          JPanel jpPulsanti = new JPanel( new FlowLayout(FlowLayout.CENTER, 80, 20) );
          cmdSerializza = new JButton("Salva");
          cmdSerializza.addActionListener( this );
    
          cmdDeserializza = new JButton("Leggi");
          cmdDeserializza.addActionListener( this );
    
          jpPulsanti.add( cmdSerializza );
          jpPulsanti.add( cmdDeserializza );
    
          jpCentrale = new JPanel();
          BoxLayout bLay = new BoxLayout(jpCentrale, BoxLayout.Y_AXIS);
          jpCentrale.setLayout( bLay );
    
          c.add(jpPulsanti, BorderLayout.NORTH);
          c.add(jpCentrale, BorderLayout.CENTER);
    
          setTitle("Serializzazione");
          setSize(800, 600);
          setDefaultCloseOperation( EXIT_ON_CLOSE );
          setLocationRelativeTo( null );
          setVisible( true );
       }
    
       private void creaArchivioRisultati() {
          archivio = new ArchivioRisultati();
          archivio.add( new Risultati("uno", "uno", "uno", 1) );
          archivio.add( new Risultati("due", "due", "due", 2) );
          archivio.add( new Risultati("tre", "tre", "tre", 3) );
          archivio.add( new Risultati("quattro", "quattro", "quattro", 4) );
          archivio.add( new Risultati("cinque", "cinque", "cinque", 5) );
       }
    
       private void stampaArchivio() {
          int numRis = archivio.numMatched();
          for(int i=0; i<numRis; i++) {
             Risultati r = archivio.getRisultati( i );
             JLabel lbl = new JLabel(r.getNomeFile() + " - " + r.getStringaTrovata() + " - " + r.getStringaRimpiazzata() + " - " + r.getPosition());
             jpCentrale.add( lbl );
          }
          jpCentrale.revalidate();
          doLayout();
          repaint();
       }
    
       private void serializza() {
          creaArchivioRisultati();
    
          FileOutputStream fos = null;
          ObjectOutputStream oos = null;
          try {
             fos = new FileOutputStream("mioSerial.dat");
             oos = new ObjectOutputStream( fos );
             oos.writeObject( archivio );
             oos.flush();
          } catch (Exception e) {
             e.printStackTrace();
          } finally {
             if (oos != null) {
                try { oos.close(); } catch (Exception e) { }
             } else {
                if (fos != null) {
                   try { fos.close(); } catch (Exception e) { }
                }
             }
          }
       }
    
       private void deserializza() {
          archivio = null;   // Mi assicuro di non lavorare su una vecchia copia
          FileInputStream fis = null;
          ObjectInputStream ois = null;
          try {
             fis = new FileInputStream("mioSerial.dat");
             ois = new ObjectInputStream( fis );
             archivio = (ArchivioRisultati) ois.readObject();
          } catch (Exception e) {
             e.printStackTrace();
          } finally {
             if (ois != null) {
                try { ois.close(); } catch (Exception e) { }
             } else {
                if (fis != null) {
                   try { fis.close(); } catch (Exception e) { }
                }
             }
          }
          stampaArchivio();
       }
    
       @Override
       public void actionPerformed(ActionEvent ae) {
          JButton cmd = (JButton) ae.getSource();
          if ( cmd.equals(cmdSerializza) ) {
             serializza();
          } else {
             deserializza();
          }
       }
    
       public static void main(String[] args) {
          Test t = new Test();
       }
    }
    Funziona tutto a meraviglia.

    Il test l'ho effettuato in questo modo:

    1) Ho avviato l'applicazione e ho cliccato su "Salva". Questo ha generato il file.
    2) Ho chiuso l'applicazione.
    3) Ho riaperto l'applicazione, ho cliccato su "Leggi".
    4) Nel pannello centrale, come mi aspetto, vedi i 5 oggetti.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it L'avatar di Relais
    Registrato dal
    Sep 2011
    Messaggi
    19
    Ok io ho copiato il tuo codice in un progetto a parte e vedo che ineffetti funziona da dio (giusto per vedere se magari era una cosa che non centrava con java xD), ok poi ho copiato i tuoi metodi di serializzazione e di deserializzazione e li ho messi nel mio progetto originale ma il risultato è sempre lo stesso... Ma non sembra un assurdità?

    Ho provato a vedere il file che viene salvato ci sono delle scritte indecifrabili ad occhio umano te lo copio cosi non si sa mai (questo vuol dire che comunque la serializzazione funziona)

    codice:
    ¬í sr ArchivioRisultati  L listat Ljava/util/Vector;xpsr java.util.VectorÙ—}[€;¯ I capacityIncrementI elementCount[ elementDatat [Ljava/lang/Object;xp ur [Ljava.lang.Object;ÎXŸs)l xp (ppppppppppppppppppppppppppppppppppppppppx
    Ma la deserializzazione ha qualche problema, non riesce forse a capire la scritta qua sopra?

    Infatti e vado a vedere il file creato dal tuo programmino di esempio è diverso... è cosi:

    codice:
    ¬í sr it.palumbo.ArchivioRisultati  L listat Ljava/util/Vector;xpsr java.util.VectorÙ—}[€;¯ I capacityIncrementI elementCount[ elementDatat [Ljava/lang/Object;xp ur [Ljava.lang.Object;ÎXŸs)l xp sr it.palumbo.Risultati  I positionL nomeFilet Ljava/lang/String;L stringaRimpiazzataq ~ L stringaTrovataq ~ xp t unoq ~ q ~ sq ~  t dueq ~ q ~ sq ~  t treq ~ q ~ sq ~  t quattroq ~ q ~ sq ~  t cinqueq ~ q ~ pppppx
    Piu che diverso è poù lungo... Nessuna idea ti può venire in mente di cosa può essere l'errore?

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ad occhio sembra che siano gli oggetti Risultati (che dovrebbero essere contenuti nel Vector) ad essere nulli già in fase di serializzazione. Non se ne trova traccia nel tuo file di serializzazione.

    Verifica questa cosa.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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.