Newsgroup: it.comp.java
Titolo: Serializzazione

Qualcuno ha voglia e tempo di spiegarla brevemente, magari anche solo
mandando un esempio.
Grazie a tutti.
Ciao.
Ale

Serializzare vuol dire creare una copia dell'oggetto in questione salvandone
i files collegati.
Ti faccio un esempio utilizzando un linguaggio che non supporta nativamente
la serializzazione (ie il C):
Windows mette a disposizione la funzione WriteFile che non fa altro che
copiare esattamente com'è la memoria associata all'idirizzo passato. Qundi
finchè hai dati puri (int, float, etc...) potresti utilizzare ReadFile per
ottenere ancora quei dati. Il problema compare quando ci sono i puntatori
che non sono altro che indirizzi a dati associati dinamicamente (quindi
incosistenti fra una sessione e la successiva). Diventa quindi necessario
trovare un metodo per associare (dopo averlo caricato) il dato caricato
dalla memoria.
Un oggetto in grado di salvare e ricaricare il suo stato in sessioni
successive (mantenendo i puntatori corretti) si dice "persistente".
La serializzazione fa questo per te: rende tutti gli oggetti persistenti.
Mediante readObject e Java salva l'oggetto e tutti i suoi collegamenti
rendendo semplice il processo. Inoltre Java si cura di mantenere consistenti
le rappresentazioni binarie dell'oggetto cosicchè un int è tale sia su
sistemi big-endian (ibm-comp) che little-endian (apple).
Uno svantaggio riguardante la serializzazione di Java è che, insieme ai
dati, viene salvato il checksum del file class che l'ha prodotto: vuol dire
che se serializzi un oggetto e poi aggiungi un metodo alla classe (pur non
modificando i dati!) Java si rifiuterà di caricarlo.
Sperando di essere stato chiaro ti saluto,
ByEZ,
MindFlavor's Site 
http://web.tiscalinet.it/mindflavor
Mail: mailto:
mindflav...@hotmail.com


Hai provato a guardare i tutorial di 
java.sun.com
 ?

 modificando i dati!) Java si rifiuterà di caricarlo.
E se l'oggetto contiene dati non serializzabili, come awt.Image?
Grazie.
Ciao.
Ale

E se l'oggetto contiene dati non serializzabili, come awt.Image?
Non puoi serializzarlo, no? 
-- 
God is Real, unless declared Integer.
ObjectZone - 
http://space.tin.it/computer/csadun/

> Non puoi serializzarlo, no?
Sarň poco intelligente, ma non ho capito la tua risposta.
Il mio scopo sarebbe salvare un array di oggetti, che tra le altre cose
contengono una variabile di tipo Image.
class myclass
{
    Image myImage;
    int i,j;
    String s;
    Vector v;//v contiene oggetti myclass
}
Si puň fare in qualche modo?
Come?
Per ora ho fatto cosě, ma non funziona il caricamento:
 public static final void leggiCCompDaFile(String filename,LinkTestCanvas
canvas)
 {
   try
    {
      FileInputStream istream = new FileInputStream(filename+".tmp");
     ObjectInputStream p = new ObjectInputStream(istream);
      int length=p.readInt();
      System.out.println(""+length);
      canvas.numNodi=length;
      file://ChartComponent[] v=new ChartComponent[length];
      for(int i=0;i<length;i++)
      {
        boolean rect=p.readBoolean();
        ChartColor cColor=(ChartColor)p.readObject();
        Point curPos=(Point)p.readObject();
        Font font=(Font)p.readObject();
        Vector linkNameVect=(Vector)p.readObject();
        Vector colorVect=(Vector)p.readObject();
        int lastWidth=p.readInt();
        int lastHeight=p.readInt();
        String text=(String)p.readObject();
        if(rect)
          canvas.ccomp[i]=new Rect(text,font,canvas,cColor);
        else
          canvas.ccomp[i]=new Circle(text,font,canvas,cColor);
        canvas.ccomp[i].curPos.x=curPos.x;
        canvas.ccomp[i].curPos.y=curPos.y;
        canvas.ccomp[i].linkNameVect=linkNameVect;
        canvas.ccomp[i].colorVect=colorVect;
        canvas.ccomp[i].lastWidth=lastWidth;
        canvas.ccomp[i].lastHeight=lastHeight;
        System.out.println(""+text);
        canvas.repaint();
      }
   }
   catch(IOException e) // Problemi nella lettura del file
   {
      System.out.println(""+e);
  }
    catch(ClassNotFoundException eCNFE)
    {
      System.out.println(""+eCNFE);
  }
 }
  public static final void scriviCCompSuFile(String
filename,ChartComponent[] v,int numNodi)
  {
   try
    {
      FileOutputStream ostream = new FileOutputStream(filename+".tmp");
      ObjectOutputStream p = new ObjectOutputStream(ostream);
      p.writeInt(numNodi);
      for(int i=0;i<numNodi;i++)
      {
        p.writeBoolean(v[i].rect);
        p.writeObject(v[i].cColor);
        p.writeObject(v[i].curPos);
        p.writeObject(v[i].font);
        p.writeObject(v[i].linkNameVect);
        p.writeObject(v[i].colorVect);
        p.writeInt(v[i].lastHeight);
        p.writeInt(v[i].lastWidth);
        p.writeObject(v[i].text);
      }
      p.flush();
      ostream.close();
    }
   catch(IOException e) // Problemi nella lettura del file
   {
      System.out.println(""+e);
  }
  }
Grazie per l'aiuto.
Ciao.
Ale

contengono una variabile di tipo Image.
Se una classe e' standard, non puoi modificarla. E se una classe non 
modificabile *non* implementa Serializable, non puoi serializzarla. 
Ne segue che se il tuo array di oggetti contiene una classe standard non 
serializzabile, avrai un errore runtime se provi a serializzarlo o a 
caricarlo. Il che per Image ha senso, dato che la classe incapsula 
un'immagine da visualizzare su uno specifico toolkit grafico su una 
specifica piattaforma in uno specifico spazio di indirizzamento eccetera. 
:)
L'hint che la cosa ti da' e' che - dato che non puoi serializzare l'oggetto 
- devi trovare il modo di serializzarne il contenuto. Ma qual'e' il 
contenuto di un'Image? Una bitmap. Quindi salva la bitmap, in uno dei mille 
formati grafici esistenti. Oppure costruisci una classe (serializzabile) 
che contiene il formato (sotto forma di byte[], serializzabile) che 
desideri: jpg, gif, eccetera.
Ovviamente non vorrai farlo tu, 'sto lavoro. :) Ma gli sviluppatori di 
librerie stanno li' apposta. Ci sono librerie per salvare/caricare GIF, JPG 
eccetera.
Quindi il tuo problema si trasforma nel trovare (e usare) queste librerie.
C'e' qualcosa - se non ricordo male - nello stesso JDK o a livello di 
estensioni - ma se fai una ricerca sul www trovi probabilmente di piu'.
Prova a partire da 
java.sun.com
 e cercare da li'.


 >Sarò poco intelligente, ma non ho capito la tua risposta.
