THMMY.gr

Ηλεκτρονικοί Υπολογιστές και Τεχνικά Θέματα => Java => Topic started by: Turambar on January 08, 2010, 19:46:38 pm



Title: [java] Αποθήκευση αντικειμένων για χρήση αργότερα.
Post by: Turambar on January 08, 2010, 19:46:38 pm
Υπάρχει τρόπος να αποθηκεύσεις αντικείμενα, σε κάποιο αρχείο πχ, για να τα πάρεις αργότερα.

Αυτό που θέλω να κάνω, χωρίς να μπλέξω με βάσεις δεδομένων, είναι να σώζω τα instances των αντικειμένων όταν τελειώνει η εφαρμογή, και όταν ξαναρχίζει, να αναζητά αν υπάρχουν τα αποθηκευμένα, και τότε να τα φορτώνει.


Ξέρει κανείς κάτι?


Title: Re: [java] Αποθήκευση αντικειμένων για χρήση αργότερα.
Post by: alekos on January 08, 2010, 20:48:15 pm
Αν μπορείς γίνε λίγο πιο συγκεκριμένος

Από οτι κατάλαβα έχεις μια δομή με δεδομένα και θέλεις να την αποθηκεύσεις για χρήση αργότερα.
Ένας τρόπος ειδικά αν δεν θέλεις να μπλέξεις με βάσεις είναι να χρησιμοποιήσεις xml αρχεία.
Πάντως σκέψου και την λύση της Java DB http://developers.sun.com/javadb/  που είναι ενσωματωμένη στην SE της Java


Title: Re: [java] Αποθήκευση αντικειμένων για χρήση αργότερα.
Post by: digitally cursed on January 08, 2010, 21:01:47 pm
Μπορεις να χρησιμοποιήσεις το yaml. Ειναι πολυ βολικο σε ruby και απο οπου το ξερω. Για java δεν ξερω αν ειναι τόσο γερό.
http://jyaml.sourceforge.net/tutorial.html


Title: Re: [java] Αποθήκευση αντικειμένων για χρήση αργότερα.
Post by: Emfanever on January 08, 2010, 21:24:23 pm
Η Java έχει εντολές ειδικά γιαυτή τη λειτουργία

Είναι το λεγόμενο serialization και deserialization , όπου τα αντικείμενα αποθηκεύονται και ανακτώνται με αρχεία τύπου .ser



Title: Re: [java] Αποθήκευση αντικειμένων για χρήση αργότερα.
Post by: Emfanever on January 08, 2010, 21:34:34 pm
Παράδειγμα σε γενικές γραμμές

Έστω θέλεις να αποθηκεύσεις το αντικείμενο object1 τύπου MyClass

FileOutputStream fileStream = new FileOutputStream ( "MyObject.ser" );      // φτιάχνεις μια σύνδεση με αρχείο

ObjectOutputStream os = new ObjectOutputStream( fileStream );    // Το ObjectOutputStream χρησιμοποιείται για εγγραφή αντικειμένων, αλλά δε

                                                                                                  // μπορεί να συνδεθεί απευθείας με αρχείο ( γιαυτό χρησιμοποιεί το fileStream )

os.writeObject(object1);

os.close();


Και η αντίστροφη διαδικασία (ανάγνωση) :

FileInputStream fileStream = new FileInputStream( "MyObject.ser");

ObjectInputStream os = new ObjectInputStream(fileStream);

Object one = os.readObject();   // τα αντικείμενα τα διαβάζει με τη σειρά που αποθηκεύτηκαν

MyClass newOne = (MyClass) one;  // κάνεις cast

os.close();


Για να μπορείς να αποθηκεύσεις το αντικείμενο η κλάση του πρέπει να κάνει implement το interface "Serializable"

edit : Μέσα σε try-catch αυτά γιατί πετάνε exceptions


Title: Re: [java] Αποθήκευση αντικειμένων για χρήση αργότερα.
Post by: Turambar on January 09, 2010, 06:49:09 am
Ω σε ευχαριστώ εμφανέβερ...

Η έρευνα μου στο νετ δεν με οδήγησε σε κάτι τόσο απλό και είχα αρχίσει να ανησυχώ ότι δεν θα υπήρχε κάτι τόσο όμορφο.


Και αν δεν κάνω λάθος αυτό θα αποθηκεύει όλες τις instances e?

Groovy... όπως ακριβώς το ήθελα. Ίσως και λίγο καλύτερo από το καλύτερο που ήλπιζα να βρω :D


Title: Re: [java] Αποθήκευση αντικειμένων για χρήση αργότερα.
Post by: Emfanever on January 09, 2010, 12:14:09 pm
Αν πχ το συγκεκριμένο αντικείμενο που θέλεις να κάνεις serialize, έχει σαν variable ένα άλλο αντικείμενο και αυτό με τη σειρά του ένα άλλο αντικείμενο,  τα αντικείμενα αυτά αποθηκεύονται αυτόματα.

Αλλά πρέπει και αυτά να κάνουν implement το interface Serializable , αλλιώς θα σου βγάλει σφάλμα

Τώρα αν εσύ δε θέλεις να αποθηκεύσεις μια συγκεκριμένη instance variable του αντικειμένου ή δε γίνεται να την αποθηκεύσεις επειδή δεν είναι Serializable θα βάλεις μπροστά τη δεσμευμένη λέξη transient (και η μεταβλητή θα πάρει την default τιμή )

Και τέλος όταν κάνεις deserialize,όπως είναι λογικό, οι constructors δεν τρέχουν




Title: Re: [java] Αποθήκευση αντικειμένων για χρήση αργότερα.
Post by: Turambar on January 09, 2010, 20:51:56 pm
Όχι όχι, τα instances θέλω...

Θέλω να φτιάχνω αντικείμενα με συγκεκριμένες τιμές το καθένα, και να τα έχω, όταν ξανανοίγω την εφαρμογή.

;)


Title: Re: [java] Αποθήκευση αντικειμένων για χρήση αργότερα.
Post by: Emfanever on January 09, 2010, 21:20:56 pm
ναι έτσι γίνεται

το object1 στο παραπάνω παράδειγμα είναι instance της κλάσης MyClass με συγκεκριμένες τιμές στις μεταβλητές του.
Όταν το αποθηκεύεις, αποθηκεύται στην κατάσταση που βρίσκεται εκείνη τη στιγμή.

όταν ξανανοίξεις την εφαρμογή και διαβάσεις το αντικείμενο, θα έχει τις τιμές που είχε όταν το αποθήκευσες

δε ξέρω αν εννοείς κάτι άλλο και δεν το κατάλαβα  :-\