Προς το περιεχόμενο

Sosimo arxeion me to serializable..Help


InDiO

Προτεινόμενες αναρτήσεις

Δημοσ.

Loipon prospathisa prin ligo kairo na kano kati tetoio alla den katafera na kano tipota stin ousia.<P>O kodikas pou eftiaksa einai o parakato. Isos exei kapio lathos, isos einai entelos lathos, pantos ton paratheto.<P> public static void saveSet(String name)throws FileNotFoundException, IOException{<BR> FileOutputStream file=new FileOutputStream(name);<BR> ObjectOutputStream OOS=new ObjectOutputStream(file);<BR> OOS.writeObject(variables);<BR> }<P> public static void loadSet(String name)throws FileNotFoundException, IOException, ClassNotFoundException{<BR> FileInputStream file = new FileInputStream(name);<BR> ObjectInputStream OIS = new ObjectInputStream(file);<BR> variables=(Vector) OIS.readObject();<BR> }<P>Aftes einai dio methodoi, mia gia to serialize kai mia gia tin anaktisi. An brethi kati endiaferome kai ego.

Δημοσ.

Για να γίνει αυτό πρέπει (όχι απαραίτητα βέβαια) η κλάσση σου να εφαρμόζει το Serializable (ή Externilizable) interface. με αυτό μπορείς να σώσεις την κατάσταση ενός αντικειμένου σε ένα stream και να φορτώσεις το ίδιο αντικείμενο από αυτό το stream. Για να σώσεις ένα αντικείμενο πρέπει να χρησιμοποιήσεις τη writeObject() μέθοδο και για να επανακτήσιες το ίδιο αντικείμενο πρέπει να χρησιμοποιήσεις τη readObject() μέθοδο (από ObjectOutputStream και ObjectInputStream αντιστοίχως).<P> Αν υποθέσουμε ότι έχεις μία κλάσση που να εφαρμόζει το Serializable interface τότε θα μπορούσες να κάνεις κάτι σαν:<P><BLOCKQUOTE><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><HR><pre><P>import java.io.*;<P>public class mySerialObject implements Serializable<BR>{<BR> // Return a string<BR> public String getString()<BR> {<BR> return "This is from serializable";<BR> }<P> // Create a stream to write to a file.<BR> FileOutputStream fos = new FileOutputStream("c:/myFile");<P> // Create an object that can write to the file.<BR> ObjectOutputStream ous = new ObjectOutputStream(fos);<P> // Write (save) the data<BR> ous.writeObject(this);<P> // Force everything to be written to the stream.<BR> ous.flush();<P> // Create file to retrieve the object<BR> FileInputStream fis = new FileInputStream("c:/myFile");<P> // Create object to read from the file<BR> ObjectInputStream ois = new ObjectInputStream(fis);<P> // New Serial object<BR> MySerialObject mso = new MySerialObject();<P> // Retrieve the object.<BR> mso = (MySerialObject) ois.readObject();<P> // Type the data<BR> System.out.println(mso.getString());<BR>}<BR></pre><HR></BLOCKQUOTE><P> Ο παραπάνω κώδικας δημιουργεί μία κλάσση που είναι ήδη serializable. Φυσικά θα μπορούσες να έχεις ξεχωριστά serializaable αντικείμενα που να τα καλείς μέσα από κάποια άλλη κλάσση. Το παραπάνω είναι ένα πολύ απλό παράδειγμα για να σου δείξω πως να γράφεις και να διαβάζεις serial αντικείμενα. Το mso αντικείμενο είναι η σειριακή μορφή της αρχικής κλάσσης. Μπορεί να έχω λάθη στον κώδικα, οπότε μπορεί να μη δουλέψει. Αλλά πιστεύω να πιάσεις τη βασική ιδέα.<P> Φιλικά.

Δημοσ.

O kodikas pou egrapsa einai dio methodoi oi opoies briskonte se alli class kai apothikevoun ena vector. Diladi to variables einai enas vector, pou apo oti diabasa sto javadoc tou leei oti ilopioi to serializable.<P>Apo oti eida ston kodika sou girioni to lathos mou itan oti kato apo tin entoli OOS.writeObject(variables); prepei na prostheso kai tin entoli OOS.flush();<BR>Afto to dokimasa alla den dixnei na doulevei.<P>Dimiourgei aplos ena arxeio me to parakato periexomeno:<BR>¬ν sr java.util.VectorΩ}[;― I capacityIncrementI elementCount[ elementDatat [Ljava/lang/Object;xp ur [Ljava.lang.Object;ΞXs)l xp <BR>pppppppppp<P>Pantos poli orea dinatotita to serializable. Xekourasto pragma. Arki na to baloume na doulepsei wink.gif" border="0

Δημοσ.

Loipon,(ksanaxrisimopoio to klassiko paradeigma me to bankaccount)<BR>Ftiano eno soro kainourgia bankaccount objects, ta opoia ta sozo prosorina stin mnimi se ena vector. Pos mporo na soso ayto to vector(h kai alla vectors) se ena arxeio, kai na to kalo kathe fora otan ksanaksekina to programma?Etsi molis mpainei o xristis tha mporei na anaktisei oles tis plirofories pou eixe eisagei tin proigumeni fora...Thanx in advance..

Δημοσ.

Η Vector κλάσση εφαρμόζει το Serializabe και Cloneable οπότε είναι από μόνη της σειριακή. Τώρα το ότι δε δουλεύει κάτι στο πρόγραμμα μπορεί να μην έγκειται στο Serializable αλλά σε κάποιο άλλο τμήμα της εφαρμογής σου. Αν έχεις πραγματικά κολλήσει και ψάχνεις απεγνωσμένα βοήθεια τότε καταχώρησέ τον κώδικά σου, πες μας που βγάζει λάθος και ίσως να μπορέσουμε να σε βοηθήσουμε.<P>Φιλικά.

Δημοσ.

Exoume gia paradeigma to parakato programma<P>public class Main{<BR> static Vector v=new Vector();<BR> public static void main(String[] args){<BR> String a=new String("test");<BR> v.addElement(a);<BR> try{<BR> saveSet("c:\test.dat");<BR> }<BR> catch(Exception e){}<BR> v.clear();<BR> try{<BR> loadSet("c:\test.dat");<BR> }<BR> catch(Exception e){}<BR> System.out.println(v.size());<BR> String b=(String) v.elementAt(0);<BR> System.out.println(B);<BR> }<BR> public static void saveSet(String name)throws FileNotFoundException, IOException{<BR> FileOutputStream file=new FileOutputStream(name);<BR> ObjectOutputStream OOS=new ObjectOutputStream(file);<BR> OOS.writeObject(v);<BR> OOS.flush();<BR> }<BR> public static void loadSet(String name)throws FileNotFoundException, IOException, ClassNotFoundException{<BR> FileInputStream file = new FileInputStream(name);<BR> ObjectInputStream OIS = new ObjectInputStream(file);<BR> v=(Vector) OIS.readObject();<BR> }<BR>}<P>To egrapsa proxira. Kanonika, an douleve to serializable, tha eprepe na tiponei ta parakato:<P>1<BR>test<P>Antaftou tiponei 0 kai petaei ArrayIndexOutOfBoundsException mias kai o vector menei adeios meta tin anaktisi tou apo tin loadSet.<P>Sto proigoumeno post mou edosa to periexomeno tou arxeiou pou dimiourgite. Apo afto an gnorizei kapios mporei na dei an i saveSet() den apothikevei ta periexomena tou Vector i an i loadSet() den ta anakta sosta. Ego etsi opos to blepo to arxeio den blepo pouthena na einai apothikevmena periexomena.

Δημοσ.

Ωραία, καλά που καταχώρησες τον κώδικά σου για να δούμε τι πάει λάθος.<BR> Λοιπόν για αρχή: Είναι δύσκολο να σειριοποιήσεις κλάσσεις με στατικά (static) ή βραχύβια (transient) μέλη. Μόνο τα δεδομένα που είναι υφιστάμενα με κάποια συγκεκριμένη αναφορά (instance) της κλάσσης μπορούνε να γίνουνε σειριακά αυτομάτως, οπότε στατικά δεδομένα (δηλαδή δεδομένα που συσχετίζονται με την κλάσση την ίδια και όχι με την αναφορά της κλάσσης) δεν μπορούνε να γίνουνε σειριακά αυτομάτως. Για να σειριοποιήσεις στατικά δεδομένα πρέπει να γράψεις σειριοποίηση συγκεκριμένα για την κλάσση (και όχι την αναφορά της).<P> Δεύτερον (φιλική συμβουλή): Μία καλή πρακτική προγραμματισμού είναι να παρέχεις συγκεκριμένες εξαιρέσεις (π.χ. ClassNotFoundException, IOException κλπ) και όχι μία γενική (Exception). Αυτό σε βοηθάει να βρεις τα λάθη πιο εύκολα και να κάνεις το πρόγραμμά σου πιο καθαρό. Έκανα copy/paste το πρόγραμμά σου και είδα ότι είχα ακριβώς τα ίδια λάθη (0, ArrayIndexOutOfBoundsException). To θέμα είναι ότι μου πετούσε εξαιρέσεις και μία από αυτές ήτανε FileNotFoundException. Ο λόγος ήτανε γιατί η c:\test.dat μεταφράζεται ως est.dat. Αν παρατηρήσεις θα δεις ότι ο χαρακτήρας "\" χρησιμοποιείται για να αγνοούμε τον επόμενο χαρακτήρα και όχι ως διαχωριστικός για τους υποκαταλόγους. Το σωστό θα ήτανε να γράψεις: c:/test.dat. Το περίεργο είναι βέβαια ότι σε εσένα δούλεψε από τη στιγμή που καταχώρησες το περιεχόμενο του αρχείου. Τέλως πάντων.... Παρακάτω είναι η έκδοση του προγράμματός σου που δουλεύει (με μερικές αλλαγές).<P>Main.java<P><BLOCKQUOTE><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><HR><pre><BR>package SerializeTest;<P>public class Main<BR>{<BR> public static void main(String[] args)<BR> {<BR> SerialTest st = new SerialTest();<BR> st.startSerialization();<BR> }<BR>}<BR></pre><HR></BLOCKQUOTE><P>SerialTest.java<P><BLOCKQUOTE><font size="1" face="Verdana, Helvetica, sans-serif">code:</font><HR><pre><BR>package SerializeTest;<P>import java.io.*;<BR>import java.util.*;<P>public class SerialTest<BR>{<BR> public SerialTest()<BR> {}<BR> <BR> Vector v = new Vector();<BR> <BR> public void startSerialization()<BR> {<BR> <BR> String a=new String("test");<BR> v.addElement(a);<BR> <BR> try{<BR> saveSet("c:/test.dat");<BR> }<BR> catch(FileNotFoundException fnfe)<BR> {<BR> System.out.println("File not found exception " + fnfe);<BR> }<BR> catch(IOException ioe)<BR> {<BR> System.out.println("I/O exception " + ioe);<BR> }<BR> System.out.println(v.size());<BR> v.clear();<P> try{<BR> loadSet("c:/test.dat");<BR> }<BR> catch(FileNotFoundException fnfe)<BR> {<BR> System.out.println("File not found exception (loadtest)" + fnfe);<BR> }<BR> catch(IOException ioe)<BR> {<BR> System.out.println("I/O exception (loadtest)" + ioe);<BR> }<BR> catch(ClassNotFoundException cnfe)<BR> {<BR> System.out.println("Class not found exception (loadtest)" + cnfe);<BR> }<BR> <BR> System.out.println(v.size());<BR> String b=(String) v.elementAt(0);<BR> System.out.println(B);<P> } // end startSerialization<BR> <BR> public void saveSet(String name)throws FileNotFoundException, IOException{<BR> FileOutputStream file=new FileOutputStream(name);<BR> ObjectOutputStream OOS=new ObjectOutputStream(file);<BR> OOS.writeObject(v);<BR> OOS.flush();<BR> }<BR> public void loadSet(String name)throws FileNotFoundException, IOException, ClassNotFoundException{<BR> FileInputStream file = new FileInputStream(name);<BR> ObjectInputStream OIS = new ObjectInputStream(file);<BR> v=(Vector) OIS.readObject();<BR> }<BR>}<BR></pre><HR></BLOCKQUOTE><P>Αποτέλεσμα:<BR>1<BR>1<BR>test<P> Φιλικά.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...