Newsgroup: it.comp.java
Titolo: [Serializzazione]Dove Sbaglio?

Ciao a tutti.
Sto cercando di scrivere su un file un oggetto.
A tal fine uso la serializzazione degli oggetti.
Il problema è che non capisco dove sbaglio dato che l'oggetto che carico, 
una volta effettutato il salvataggio, non è quello che mi aspetto.
Ovvero, desiderei che l'oggetto caricato avesse nome="pippo" e eta=10, 
invece ho nome=null e eta=0 (valori di default)
Vi sarei grato se poteste darmi una mano.
Grazie
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Serializza
{
public static void main(String args[])
{
Persona p;
Persona new_p=null;
p = new Persona();
p.setNome();
p.setEta();
ObjectOutputStream oos=null;
FileOutputStream fos=null;
ObjectInputStream ois=null;
try
{
fos=new FileOutputStream("x.dat");
oos=new ObjectOutputStream(fos);
}
catch(FileNotFoundException e)
{
System.out.println(e);
}
catch(IOException ex)
{
System.out.println(ex);
}
try
{
oos.writeObject(p);
oos.close();
fos.close();
}
catch(IOException ex2)
{
System.out.println(ex2);
}
System.out.println("\n--- Ok ----\n");
//-----------------------------------------
try
{
ois=new ObjectInputStream(new FileInputStream("x.dat"));
}
catch(FileNotFoundException e)
{
System.out.println(e);
}
catch(IOException ex)
{
System.out.println(ex);
}
try
{
new_p=(Persona)ois.readObject();
ois.close();
}
catch(IOException ex2)
{
System.out.println(ex2);
}
catch(ClassNotFoundException ex2)
{
System.out.println(ex2);
}
System.out.println(new_p.getNome()+"+new_p.getEta()+"\n");
}
}
----------------------------
import java.io.IOException;
import java.io.Serializable;
public class Persona implements Serializable {
private String nome;
private int eta;
private static final long serialVersionUID=1;
public Persona()
{
nome="";
eta=0;
}
public String getNome() { return nome; }
public int getEta() { return eta; }
public void setNome()
{
nome="Pippo";
}
public void setEta()
{
eta=10;
}
private void writeObject(java.io.ObjectOutputStream out) throws IOException
{
}
private void readObject(java.io.ObjectInputStream in) throws IOException, 
ClassNotFoundException
{
}
} 

 private void readObject(java.io.ObjectInputStream in) throws IOException, 
Se togli questi due metodi dovrebbe funzionare.
-- 
Andrea Francia
http://andreafrancia.blogspot.com/2008/06/relazioni-molti-molti-con-jpa.html

 Se togli questi due metodi dovrebbe funzionare.
ma non posso toglierli dato che la classe Persona, dovendo essere 
serializzabile, deve implementare Serializable 


Puoi toglierli. Prova se non ci credi.


 Puoi toglierli. Prova se non ci credi.
per carità, ti credo.
Ma allora potresti spiegarmi come è possibile toglierli dato che sono metodi 
dell'interfaccia Serializable?
mi sembra strano...tutto qui :-) 

 dell'interfaccia Serializable?
sicuro?
-- 
? Fino all'anno scorso avevo un solo difetto. Ero presuntuoso.
http://softvalley.blogspot.com
http://www.flickr.com/photos/marko_po/

 sicuro?
mah...usando Eclipse ho utilizzato la funzione che inserisce automaticamente 
i metodi di un'interfaccia.
Ciņ nonostante continuo a non comprendere il perchč togliere questi metodi 
rende l'applicazione funzionante
grazie per le vostre risposte 

 Puoi toglierli. Prova se non ci credi.
funziona davvero!
Ma perchè quei metodi davano fastidio????????? 

 Ma perchè quei metodi davano fastidio?????????
Puoi toglierli in quanto Serializable e' semplicemente:
public interface Serializable {
}
quindi tutto ok....
riguardo a quei metodi la SDK dice:
* Classes that require special handling during the serialization and
* deserialization process must implement special methods with these exact
* signatures: <p>
*
* <PRE>
* private void writeObject(java.io.ObjectOutputStream out)
* throws IOException
* private void readObject(java.io.ObjectInputStream in)
* throws IOException, ClassNotFoundException;
* private void readObjectNoData()
* throws ObjectStreamException;
* </PRE>
Tommy

 
http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html
non sono metodi definiti nell'interfaccia, ma richiesti dalle specifiche 
se vuoi customizzare il processo di serializzazione.

 Ma perchè quei metodi davano fastidio????????? 
perchè banalmente non li avevi implementati in modo corretto.
quei metodi sovrascrivono il comportamento di default durante la 
serializzazione, comportamento che a te va benissimo. vanno implementati 
quando ci sono delle situazioni particolari da gestire, in questo 
momento non mi viene nemmeno un esempio (forse se avessi dei field non 
serializzabili?)


 serializzabili?)
va benissimo!
grazie a tutti! 

 i metodi di un'interfaccia.
Serializable è una di quelle interfacce (insieme a Clonable) che non 
definisce alcuna proprietà o metodo, ma semplicemente serve a "marcare" 
la classe che la implementa come classe che ha un determinato comportamento.
