Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    41

    Problema serializzazione oggetti su file

    salve a tutti, sono nuovo di questo forum e vorrei sapere se potete aiutarmi a risolvere un problema con la serializzazione degli oggetti su file.

    codice:
    import java.io.*;
    
    
    import javax.swing.*;
    
    public class Registrazione 
    {
    	private String user;
    	private String pass;
    	
    	private ObjectOutputStream output;
    	private ObjectInputStream input;
    	
    	public Registrazione(String user, String pass)
    	{
    		this.pass = pass;
    		this.user = user;
    	}
    	
    	public Registrazione(){}
    	
    	public void openFileWrite()
    	{
    		try
    		{
    			output = new ObjectOutputStream(new FileOutputStream("user.ser",true));
    		}
    		catch(IOException e)
    		{
    			JOptionPane.showMessageDialog(null,"Errore nell'apertura del File!!!","Errore", JOptionPane.ERROR_MESSAGE);
    			return;
    		}
    	}
    	
    	private void closeFileRead()
    	{
    		try
    		{
    			if(input!=null)
    			{
    				input.close();
    			}
    		}
    		catch(IOException e)
    		{
    			JOptionPane.showMessageDialog(null,"Errore nella chiusuta del file!!!","Errore", JOptionPane.ERROR_MESSAGE);
    			return;
    		}
    	}
    	
    	private void closeFileWrite()
    	{
    		try
    		{
    			if(output!=null)
    			{
    				output.close();
    			}
    		}
    		catch(IOException e)
    		{
    			JOptionPane.showMessageDialog(null,"Errore nella chiusuta del file!!!","Errore", JOptionPane.ERROR_MESSAGE);
    			return;
    		}
    	}
    	
    	public void openFileRead()
    	{
    		try
    		{
    			input = new ObjectInputStream(new FileInputStream("user.ser"));
    		}
    		catch(IOException e)
    		{
    			JOptionPane.showMessageDialog(null,"Errore nell'apertura del File!!!","Errore", JOptionPane.ERROR_MESSAGE);
    		}
    	}
    	
    	public void registraUser()
    	{
    		AccountRecordSerializable record;
    		openFileWrite();
    		try
    		{									
    			record = new AccountRecordSerializable(user,pass);
    			output.writeObject(record);
    		}
    		catch(IOException e)	
    		{
    				
    		}
    		closeFileWrite();
    	}
    	
    	public void controllaUserEsistente()
    	{
    		AccountRecordSerializable record= null;
    		boolean utente_non_trovato = true;
    		
    		openFileRead();
    		
    		try
    		{
    			while(utente_non_trovato)
    			{
    				record = (AccountRecordSerializable) input.readObject();
    				System.out.println(record.getUser());
    				System.out.println(record.getPass());
    				if(user.equals(record.getUser()))
    				{
    					utente_non_trovato = false;
    					JOptionPane.showMessageDialog(null, "Utente già esistente!","Informazione",JOptionPane.INFORMATION_MESSAGE);
    				}			
    
    			}
    		}
    		catch(EOFException e)
    		{
    			closeFileRead();
    			registraUser();
    		}
    		catch(ClassNotFoundException e)
    		{
    			JOptionPane.showMessageDialog(null, "catch class!","Informazione",JOptionPane.INFORMATION_MESSAGE);
    		}
    		catch(IOException e)
    		{
    			JOptionPane.showMessageDialog(null, "catch IO!","Informazione",JOptionPane.INFORMATION_MESSAGE);
    		}
    		return;
    	}
    	
    }
    L'inserimento avviene su main attraverso due JOptionPane.showinputdialog.

    io inserisco il primo oggetto nel file e tutto va ok!
    quando inserisco il secondo oggetto e si attiva il metodo controllaUserEsistente() si attiva l'eccezione (IOException).

    non so per quale motivo.....è sbagliato il codice? ditemi voi se avete qualche altra soluzione.

    p.s. come avete visto si tratta di verificare se l'utente è gia registrato oppure no e di inserirlo nel file.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Non ho letto per bene tutto il codice ma una cosa l'ho notata subito, cioè:

    output = new ObjectOutputStream(new FileOutputStream("user.ser",true));

    con 'true' per fare un "append" sul file.

    Male ... perché il processo di serializzazione degli oggetti non funziona in "append".

    C'è un motivo ben preciso per questo, che dipende dal formato dei dati scritti dalla serializzazione. Quando il processo di serializzazione inizia, prima di scrivere un qualunque oggetto, viene scritto un "header" di marcatura di pochi byte. Se si apre il file in append, tale header viene logicamente scritto di nuovo. Peccato che se ci sono già altri oggetti nel file, tale header si trova in mezzo al file, mischiato insieme agli oggetti. Quando si tenterà di leggere il file dall'inizio per deserializzare gli oggetti, ad un certo punto il processo di deserializzazione si troverà con questo header, che chiaramente non si aspetta. E quindi la deserializzazione fallisce con una eccezione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Soluzione al problema: prima leggi tutto il file (se già esiste) e tieni in memoria tutti gli oggetti letti (in una struttura dati apposita come un Vector o un ArrayList).

    Quindi riscrivi l'intero file (mettendo, di conseguenza, false nel secondo argomento del costruttore di FileOutputStream): prima tutti gli oggetti che già erano presenti nel file (quelli nel Vector o nell'ArrayList), poi quelli nuovi da aggiungere.


    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

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    41
    Originariamente inviato da LeleFT
    Soluzione al problema: prima leggi tutto il file (se già esiste) e tieni in memoria tutti gli oggetti letti (in una struttura dati apposita come un Vector o un ArrayList).

    Quindi riscrivi l'intero file (mettendo, di conseguenza, false nel secondo argomento del costruttore di FileOutputStream): prima tutti gli oggetti che già erano presenti nel file (quelli nel Vector o nell'ArrayList), poi quelli nuovi da aggiungere.


    Ciao.
    ciao....sono un po uno newbie del java....non è che mi potresto far vedere un po di codice che devo implementare??

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Questo è un semplice metodo per leggere da un ObjectInputStream tutti gli oggetti e metterli in un ArrayList:

    codice:
    public static ArrayList readAllObjects (ObjectInputStream ois)
        throws ClassNotFoundException, IOException
    {
        ArrayList objectsList = new ArrayList ();
    
        try {
            while (true) {
                objectsList.add (ois.readObject ());
            }
        }
        catch (EOFException e) { }
    
        return objectsList;
    }
    Fare il contrario, cioè dato un ArrayList scrivere su un ObjectOutputStream tutti gli oggetti è ancora più semplice, lo lascio come esercizio a te.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    41
    Originariamente inviato da andbin
    Questo è un semplice metodo per leggere da un ObjectInputStream tutti gli oggetti e metterli in un ArrayList:

    codice:
    public static ArrayList readAllObjects (ObjectInputStream ois)
        throws ClassNotFoundException, IOException
    {
        ArrayList objectsList = new ArrayList ();
    
        try {
            while (true) {
                objectsList.add (ois.readObject ());
            }
        }
        catch (EOFException e) { }
    
        return objectsList;
    }
    Fare il contrario, cioè dato un ArrayList scrivere su un ObjectOutputStream tutti gli oggetti è ancora più semplice, lo lascio come esercizio a te.
    una domanda....sapresti dirmi a che cosa serve mettere throws nell'intestazione del metodo?? serve per non gestire l'eccezione?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da poppoGBR
    una domanda....sapresti dirmi a che cosa serve mettere throws nell'intestazione del metodo?? serve per non gestire l'eccezione?
    Serve per dichiarare che il metodo può lanciare quelle eccezioni, che sono di tipo "checked" e che quindi il chiamante dovrà per forza tenerne conto o catturandole oppure facendo passare l'eccezione più a "monte" a sua volta dichiarandole con throws.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    41
    Originariamente inviato da andbin
    Questo è un semplice metodo per leggere da un ObjectInputStream tutti gli oggetti e metterli in un ArrayList:

    codice:
    public static ArrayList readAllObjects (ObjectInputStream ois)
        throws ClassNotFoundException, IOException
    {
        ArrayList objectsList = new ArrayList ();
    
        try {
            while (true) {
                objectsList.add (ois.readObject ());
            }
        }
        catch (EOFException e) { }
    
        return objectsList;
    }
    Fare il contrario, cioè dato un ArrayList scrivere su un ObjectOutputStream tutti gli oggetti è ancora più semplice, lo lascio come esercizio a te.
    ciao mi potresti dire come di fa a riscrivere tutto su file?
    io ho provato con un for.

    codice:
    public void readAllObjects ()
    	{
    		try 
    		{
    			while (true) 
    			{
    				objectsList.add((ObjectInputStream) input.readObject());
    			}
    		}
    		catch(EOFException e) {JOptionPane.showMessageDialog(null,"errore eof write","Errore", JOptionPane.ERROR_MESSAGE);}
    		catch(ClassNotFoundException e) {JOptionPane.showMessageDialog(null,"errore class write","Errore", JOptionPane.ERROR_MESSAGE);}
    		catch(IOException e) {JOptionPane.showMessageDialog(null,"Errore io write","Errore", JOptionPane.ERROR_MESSAGE);}
    	}
    poi quando vado a caricare il file nell'array mi da un eccezione di IOException perche???

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da poppoGBR
    objectsList.add((ObjectInputStream) input.readObject());
    Quel cast a ObjectInputStream non ha senso, non serve.

    Originariamente inviato da poppoGBR
    catch(EOFException e) {JOptionPane.showMessageDialog(null,"errore eof write","Errore", JOptionPane.ERROR_MESSAGE);}
    Nel mio esempio ho catturato EOFException senza fare nulla nel corpo del catch. Non è un mio errore o dimenticanza. In questo caso il fatto di ottenere un EOFException non è sintomo di un "errore". Semplicemente si è arrivati a fine del file ... non ci sono più oggetti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    41
    Originariamente inviato da andbin
    Quel cast a ObjectInputStream non ha senso, non serve.

    Nel mio esempio ho catturato EOFException senza fare nulla nel corpo del catch. Non è un mio errore o dimenticanza. In questo caso il fatto di ottenere un EOFException non è sintomo di un "errore". Semplicemente si è arrivati a fine del file ... non ci sono più oggetti.
    ho dovuto mette quel cast perche eclipse mi dava errore in run-time. poi la dichiarazione di eclipse doveva essere fatta in questo modo

    codice:
    private List<Object> objectsList = new LinkedList<Object>()

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.