Ποια είναι η έννοια του Serialization στην Java;



Αυτό το άρθρο θα βοηθήσει με μια ολοκληρωμένη προσέγγιση για την έννοια της Σειριοποίησης στην Java μαζί με παραδείγματα σε πραγματικό χρόνο για καλύτερη κατανόηση.

Σειριοποίηση σε είναι μια σημαντική ιδέα που ασχολείται με τη μετατροπή αντικειμένων σε ροή byte για τη μεταφορά των αντικειμένων java από τη μία εικονική μηχανή Java στην άλλη και την αναδημιουργία στην αρχική μορφή. Θα ευθυγραμμίσω την υποδοχή για αυτό το άρθρο όπως παρακάτω:

Τι είναι η σειριοποίηση στην Java;

Σειριοποίηση στην Java είναι η διαδικασία μετατροπής του κώδικα Java Αντικείμενο μέσα σε Ροή byte , για να μεταφέρετε τον κώδικα αντικειμένου από μια εικονική μηχανή Java σε μια άλλη και να την δημιουργήσετε ξανά χρησιμοποιώντας τη διαδικασία του Αποϊστερίωση.





Serialization-in-Java-Edureka-Picture-1

Γιατί χρειαζόμαστε τη σειρά στην Ιάβα ;

Χρειαζόμαστε σειριοποίηση για τους ακόλουθους λόγους:



  • Επικοινωνία : Η σειριοποίηση περιλαμβάνει τη διαδικασία του αντικειμένου σειριοποίηση και μετάδοση. Αυτό επιτρέπει σε πολλά συστήματα υπολογιστών να σχεδιάζουν, να μοιράζονται και να εκτελούν αντικείμενα ταυτόχρονα.

    διαφορά μεταξύ jquery και javascript
  • Προσωρινή αποθήκευση : Ο χρόνος που καταναλώνεται για την κατασκευή ενός αντικειμένου συγκρίνεται περισσότερο με τον χρόνο που απαιτείται για την απο-σειριοποίηση του. Η σειριοποίηση ελαχιστοποιεί την κατανάλωση χρόνου κατά προσωρινή αποθήκευση τα γιγαντιαία αντικείμενα.

  • Βαθύ αντίγραφο : Κλωνοποίηση η διαδικασία γίνεται απλή χρησιμοποιώντας το Serialization. Ένα ακριβές πιστό αντίγραφο ενός αντικειμένου λαμβάνεται απόσειριοποίηση του αντικειμένου σε ένα πίνακας byte και, στη συνέχεια, την απο-σειριοποίηση.



  • Σταυρός Συγχρονισμός JVM: Το κύριο πλεονέκτημα της Serialization είναι ότι είναιλειτουργεί σε διαφορετικά JVM που ενδέχεται να εκτελούνται σε διαφορετικά αρχιτεκτονικές ή Λειτουργικά συστήματα

  • Επιμονή: Η κατάσταση οποιουδήποτε αντικειμένου μπορεί να αποθηκευτεί απευθείας εφαρμόζοντας το Serialization σε αυτό και να αποθηκευτεί σε ένα βάση δεδομένων έτσι ώστε να μπορεί να είναι ανακτήθηκε αργότερα.

Πώς κάνουμε σειριοποίηση ενός αντικειμένου;

ΠΡΟΣ ΤΟ Αντικείμενο Java είναι σειριοποιήσιμος εάν και μόνο εάν η τάξη ή κάποια από τις μητρικές τάξεις της εφαρμόζουν είτε το Ιάβα . Εγώ . Σειριοποιήσιμος διεπαφή ή την υποσύνδεσή της, java.io. Εξαιρέσιμο.

Στη διαδικασία Serialization, μετατρέπουμε την κατάσταση ενός αντικειμένου σε μια ροή byte, ώστε να μπορεί να μεταφερθεί από το ένα JVM στο άλλο και να επαναφέρει τη ροή byte στο αρχικό αντικείμενο.

//Διεπαφή

πακέτο Serial1 import java.io.Serializable public class Υλοποίηση υπαλλήλου Serializable {private static final long serialVersionUID = 1L // Serial Version UID int id String name public Employee (int id, String name) {this.id = id this.name = name }}

// Σειρά

πακέτο Serial1 import java.io. * class Persist {public static void main (String args []) {try {Employee emp1 = new Employee (20110, 'John') Employee emp2 = new Employee (22110, 'Jerry') Employee emp3 = νέος υπάλληλος (20120, 'Sam') FileOutputStream fout = νέο FileOutputStream ('output.txt') ObjectOutputStream out = new ObjectOutputStream (fout) out.writeObject (emp1) out.writeObject (emp2) out.writeObject (emp3) out. flush () out.close () System.out.println («Η σειριοποίηση και η αποεπιεριοποίηση εκτελέστηκε με επιτυχία»)} catch (Exception e) {System.out.println (e)}}}

Παραγωγή:

Η σειριοποίηση και η αποεστεροποίηση εκτελέστηκε με επιτυχία

Αποϊστερίωση : Είναι η αντίστροφη διαδικασία Serialization όπου το Serialized Byte Stream ενός αντικειμένου από τον αποστολέα αναδημιουργείται στο τέλος λήψης.

// Αποθεραπεία

πακέτο Serial1 import java.io. * class Depersist {public static void main (String args []) {try {ObjectInputStream in = new ObjectInputStream (new FileInputStream ('output.txt')) Employee e1 = (Employee) in.readObject ( ) Υπάλληλος e2 = (Υπάλληλος) in.readObject () Υπάλληλος e3 = (Υπάλληλος) in.readObject () System.out.println (e1.id + '+ e1.name) System.out.println (e2.id +' + e2.name) System.out.println (e3.id + '+ e3.name) in.close ()} catch (Εξαίρεση e) {System.out.println (e)}}}

Παραγωγή:

20110 Τζον
22110 Τζέρι

20120 Σαμ

Πλεονεκτήματα και μειονεκτήματα της σειριοποίησης στην Java

Πλεονεκτήματα:

  • Η διαδικασία σειριοποίησης είναι α ενσωματωμένο δυνατότητα που δεν απαιτεί λογισμικό τρίτου μέρους για εκτέλεση Serialization
  • Η διαδικασία Serialization είναι αποδεδειγμένη απλός και Ανετα να καταλαβεις

  • Η διαδικασία σειριοποίησης είναι Παγκόσμιος και προγραμματιστές από διαφορετικό υπόβαθρο είναι εξοικειωμένοι με αυτό

  • Είναι εύκολο στη χρήση και απλό στην προσαρμογή

  • Σειριακές ροές δεδομένων υποστήριξη κρυπτογράφησης, συμπίεσης, ελέγχου ταυτότητας και ασφαλής υπολογισμός Java

  • Υπάρχουν πολλά κρίσιμες τεχνολογίες βασιζόμαστε στη σειριοποίηση.

Μειονεκτήματα:

πώς να αυξήσετε έναν αριθμό σε μια δύναμη στο java
  • Αντικείμενα ενώ γίνεται DeSerialization εύθραυστος και δεν είναι βέβαιο ότι θα αποστειρωθούν αποτελεσματικά.

  • Οι μεταβατικές μεταβλητές δηλώνονται ενώ η σειριοποίηση δημιουργεί χώρο μνήμης, αλλά ο κατασκευαστής δεν καλείται που έχει ως αποτέλεσμα την αποτυχία στην εκκίνηση μεταβατικών μεταβλητών με αποτέλεσμα παραλλαγή στην τυπική ροή Java.

  • Η διαδικασία της σειριοποίησης είναι ανεπαρκής όσον αφορά τη χρήση της μνήμης.

  • Η σειριοποίηση δεν προτιμάται να χρησιμοποιείται στις εφαρμογές που χρειάζονται ταυτόχρονη πρόσβαση χωρίς την απαίτηση του API τρίτων , καθώς η σειριοποίηση δεν προσφέρει μηχανισμό ελέγχου μετάβασης ανά SE.

  • Η διαδικασία σειριοποίησης δεν προσφέρει λεπτόκοκκος έλεγχος για πρόσβαση σε αντικείμενα.

Πρακτικά παραδείγματα Serialization στην Java

Σειριοποίηση χρησιμοποιώντας κληρονομικότητα

Περίπτωση - 1: Εάν το Superclass είναι σειριοποιήσιμο, τότε, από προεπιλογή, οι υποκατηγορίες του μπορούν επίσης να σειριοποιηθούν.

Σε αυτήν την περίπτωση, το υποδιαίρεση τάξεως είναι σειριοποιήσιμο από προεπιλογή εάν το σούπερ γυαλί εφαρμόζει το Σειριακή δυνατότητα διασύνδεσης

πακέτο SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable class A υλοποιεί Serializable {int i public A (int i) {this.i = i}} η κλάση B επεκτείνει A {int j public B (int i, int j) {super (i) this.j = j}} public class Test {public static void main (String [] args) ρίχνει την εξαίρεση {B b1 = νέο B (200,400) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = new FileOutputStream ('abc.ser') ObjectOutputStream oos = νέο ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('The object has serialized') FileInputStream fis = new FileInputStream ('abc.ser') ObjectInputStream ois = new ObjectInputStream (fis) B b2 = (B) ois.readObject () ois.close () fis.close () System.out.println ('Το αντικείμενο έχει αποστειρωθεί') System.out.println ('i = '+ b2.i) System.out.println (' j = '+ b2.j)}}

Παραγωγή:

j = 20
Το αντικείμενο έχει σειριοποιηθεί
Το αντικείμενο έχει αποστειρωθεί
i = 200
j = 400

Περίπτωση 2: Μια δευτερεύουσα τάξη μπορεί να σειριοποιηθεί εάν εφαρμόζει τη σειριακή δυνατότητα διασύνδεσης ακόμα και αν ένα Superclass δεν εφαρμόζει τη σειριακή δυνατότητα διασύνδεσης.

Σε αυτήν την περίπτωση, εάν το σούπερ γυαλί δεν εφαρμόζει το Σειριακή δυνατότητα διασύνδεσης , τότε, τα αντικείμενα του υποδιαίρεση τάξεως μπορεί να σειριοποιηθεί χειροκίνητα εφαρμόζοντας το Serializable Interface στην υποκατηγορία.

πακέτο SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable class superclass {int i public superclass (int i public superclass (int i) {this.i = i} δημόσια superclass () {i = 50 System.out.println ('Superclass κατασκευάστηκε με την ονομασία')}} η κλάση subclass επεκτείνει τις εφαρμογές superclass Serializable {int j public subclass (int i, int j) {super (i) this.j = j }} δημόσια τάξη test2 {public static void main (String [] args) ρίχνει την Εξαίρεση {subclass b1 = new subclass (10, 20) System.out.println ('i =' + b1.i) System.out.println ( 'j =' + b1.j) FileOutputStream fos = new FileOutputStream ('output.ser') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println («Το αντικείμενο έχει σειριοποιηθεί») FileInputStream fis = new FileInputStream ('output.ser') ObjectInputStream ois = new ObjectInputStream (fis) subclass b2 = (subclass) ois.readObject ( ) ois.close () fis.close () System.out.println ('Το αντικείμενο έχει αποστειρωθεί') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Το αντικείμενο έχει σειριοποιηθεί
Ο κατασκευαστής Superclass ονομάζεται
Το αντικείμενο έχει αποστειρωθεί
i = 50
j = 20

Περίπτωση - 3: Εάν το superclass είναι σειριοποιήσιμο, αλλά δεν χρειαζόμαστε να σειριοποιηθεί η υποκατηγορία.

Σε αυτήν την περίπτωση, μπορεί να αποφευχθεί η σειριοποίηση της υποκατηγορίαςεφαρμόζοντας το writeObject () και readObject () μεθόδους στην υποκατηγορία και πρέπει να ρίξει NotSerializableException από αυτές τις μεθόδους.

πακέτο SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.IOException import java.io.NotSerializableException import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.ObjectOutputStream import java.io.Serializable class Parent i public Parent (int i) {this.i = i}} παιδί class επεκτείνει το γονέα {int j δημόσιο παιδί (int i, int j) {super (i) this.j = j} private void writeObject (ObjectOutputStream out) Το IOException {throw new NotSerializableException ()} private void readObject (ObjectInputStream in) ρίχνει το IOException {ρίξτε νέο NotSerializableException ()}} δοκιμή δημόσιας τάξης3 {public static void main (String [] args) ρίχνει την Εξαίρεση {child b1 = νέο παιδί (100, 200) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = new FileOutputStream ('abc.ser') ObjectOutputStream oos = νέο ObjectOutputStream ( fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Αντικείμενο έχει σειριοποιηθεί ') FileInputStream fis = new FileInputStream (' abc.ser ') ObjectInputStream ois = new ObjectInputStream (fis) child b2 = (child) ois.readObject () ois.close () fis.close () System.out. println ('Object is deserialized') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Παραγωγή:

i = 100
j = 200
Εξαίρεση στο νήμα «main» java.io.NotSerializableException
στο SerializationInheritance.child.writeObject (test3.java:48)
στο sun.reflect.NativeMethodAccessorImpl.invoke0 (εγγενής μέθοδος)

Σειριοποίηση χρησιμοποιώντας ένα στατικό μέλος

Η σειριοποίηση του στατικού μέλους αγνοείται κατά τη διαδικασία της σειριοποίησης. Η σειριοποίηση είναισχετίζεται με την τελευταία κατάσταση του αντικειμένου. Ως εκ τούτου, μόνο τα δεδομένα που σχετίζονται με μια συγκεκριμένη παρουσία μιας κλάσης είναισειριακό αλλά όχι το πεδίο στατικού μέλους.

πακέτο stati import java.io. * class StaticSerial implement Serializable {static int i = 100 public static void main (String ... ar) {StaticSerial ob = new StaticSerial () System.out.println ('Κατά τη στιγμή της Serialization, το στατικό μέλος έχει τιμή: '+ i) δοκιμάστε το {FileOutputStream fos = new FileOutputStream (' F: File.ser ') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (ob) oos.close () i = 99 FileInputStream fis = νέο FileInputStream ('F: File.ser') ObjectInputStream ois = new ObjectInputStream (fis) ob = (StaticSerial) ois.readObject () ois.close () System.out.println ('After Deserialization, το στατικό μέλος έχει τιμή:' + i)} catch (Εξαίρεση e) {System.out.println (e)}}}

Παραγωγή:

Τη στιγμή της σειράς, το στατικό μέλος έχει τιμή: 100
Μετά την αποεστεροποίηση, το στατικό μέλος έχει τιμή: 99

Εξωτερική δυνατότητα διασύνδεσης

ο Εξωτερική δυνατότητα διασύνδεσης Στην Java είναι παρόμοιο με το Serialization, αλλά η μόνη διαφορά είναι ότι είναι σε θέση να προσφέρει προσαρμοσμένη σειριοποίηση όπου μπορείτε να αποφασίσετε τα αντικείμενα που θα αποθηκευτούν στη ροή.

Η εξωτερική δυνατότητα διασύνδεσης είναι διαθέσιμη στο java.io και παρέχει δύο μεθόδους:

  • public void writeExternal (ObjectOutput out) ρίχνει το IOException
  • public void readExternal (ObjectInput in) ρίχνει το IOException

Οι βασικές διαφορές μεταξύ Serialization και Externalizeable είναι οι εξής:

  • Εκτέλεση : Εξωτερική δυνατότητα διασύνδεσης εκτός από το χρήστη ρητά αναφέρετε τα αντικείμενα που πρόκειται να σειριοποιηθούν. Ενώ βρίσκεστε στο Serialization Interface, όλα τα αντικείμενα και οι μεταβλητές είναι σειριακά στο χρόνος εκτέλεσης.

    φροντιστήριο sql και pl sql

  • Μέθοδοι : Η εξωτερική δυνατότητα διασύνδεσης αποτελείται από δύο μεθόδους, συγκεκριμένα:

    • εγγραφή Εξωτερικό ()

    • readExternal ()

Ενώ, το Serializable Interface δεν περιλαμβάνει μεθόδους.

  • Επεξεργάζομαι, διαδικασία: Η διαδικασία σειριοποίησης στην Εξωτερική δυνατότητα διασύνδεσης παρέχει προσαρμογή στη διαδικασία σειριοποίησης. Όμως, η διεπαφή σειριοποίησης θα παρέχει το Προκαθορισμένο διαδικασία σειριοποίησης.

  • Συμβατότητα και έλεγχος προς τα πίσω: Η Εξωτερική δυνατότητα διασύνδεσης υποστηρίζει τη Σειριοποίηση ανεξάρτητα από το έλεγχος έκδοσης και το μόνο πρόβλημα είναι ότι ο χρήστης πρέπει να είναι υπεύθυνος κατά τη σειριοποίηση της Super Class. Από την άλλη πλευρά, το Serialization Interface απαιτεί το ίδια έκδοση των JVMs και στα δύο άκρα αλλά ενσωματώνει την αυτόματη σειριοποίηση όλων των αντικειμένων και των τάξεων, συμπεριλαμβανομένης της superclass.

  • Δημόσιος κατασκευαστής No-Arg: Ανάγκες διασύνδεσης εξωτερικής ανάθεσης Δημόσιος κατασκευαστής No-Arg για την ανακατασκευή του σειριακού αντικειμένου. Ενώ το Interface Serialization δεν απαιτεί No-Arg Constructor, αντ 'αυτού χρησιμοποιεί αντανάκλαση για την ανακατασκευή του σειριακού αντικειμένου ή της κλάσης.

package ext import java.io. * class Demo υλοποιεί java.io.Serializable {public int a public String b public Demo (int a, String b) {this.a = a this.b = b}} class test {δημόσια στατική void main (String [] args) {Demo object = new Demo (1, 'Welcome to Edureka') String filename = 'file.ser' try {FileOutputStream file = new FileOutputStream (filename) ObjectOutputStream out = νέο ObjectOutputStream (αρχείο) έξω .writeObject (αντικείμενο) out.close () file.close () System.out.println ('Object is serialized')} catch (IOException ex) {System.out.println ('IOException is catch')} Επίδειξη αντικειμένου1 = null δοκιμάστε {FileInputStream file = new FileInputStream (filename) ObjectInputStream in = new ObjectInputStream (file) object1 = (Demo) in.readObject () in.close () file.close () System.out.println ('Object is has been deserialized ') System.out.println (' a = '+ object1.a) System.out.println (' b = '+ object1.b)} catch (IOException ex) {System.out.println (' IOException πιάστηκε ')} catch (ClassNotFoundException ex) {System.out .println ('Το ClassNotFoundException έχει πιάσει')}}}

Προσωρινή λέξη-κλειδί

Η παροδική λέξη-κλειδί είναι α δεσμευμένη λέξη-κλειδί στην Ιάβα. Χρησιμοποιείται ως μεταβλητή τροποποίηση τη στιγμή της διαδικασίας Serialization. Η δήλωση μιας μεταβλητής με την προσωρινή λέξη-κλειδί αποφεύγει τη μεταβολή της σειράς.

UID σειριακής έκδοσης

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

Διαμάχες για σειριοποίηση στην Java

Η Oracle's Οι αρχιτέκτονες σκοπεύουν να αφαιρέσουν το Serialization από την Java καθώς το θεωρούν ως Φρικτό λάθος του 1997 . Μετά από έντονη έρευνα, οι προγραμματιστές της Oracle ανακάλυψαν μερικά ελαττώματα στο σχεδιασμό της διαδικασίας Serialization που αποτελούν απειλή για τα δεδομένα.

Το 1997,Ο Mark Reinhold δηλώνει - ' Μας αρέσει να αποκαλούμε σειριοποίηση «το δώρο που συνεχίζει να δίνει» και ο τύπος του δώρου που συνεχίζει να δίνει είναι ευπάθειες ασφαλείας. Πιθανώς το ένα τρίτο όλων των τρωτών σημείων Java να περιλαμβάνει σειριοποίηση, θα μπορούσε να είναι πάνω από το μισό. Είναι μια εκπληκτικά πηγή ευπάθειας, για να μην αναφέρουμε αστάθειες. '

Υπάρχουν πιθανότητες να αφαιρεθεί ή να αντικατασταθεί το Serialization στις επερχόμενες ενημερώσεις της Java και από την άλλη, για έναν αρχάριο στην Java, το Serialization δεν μπορούσε να είναι μια ιδεαλιστική επιλογή στα έργα τους

Βέλτιστες πρακτικές κατά τη χρήση του Serialization στην Java

Τα παρακάτω είναι μερικές βέλτιστες πρακτικές που πρέπει να ακολουθηθούν

  • Συνιστάται η χρήση javadoc @ σειριακή ετικέτα για την ένδειξη σειριακών πεδίων.
  • ο .να είναι Η επέκταση προτιμάται να χρησιμοποιείται για αρχεία που αντιπροσωπεύουν σειριακά αντικείμενα.
  • Δεν συνιστάται η υποβολή στατικών ή παροδικών πεδίων προεπιλεγμένη σειριοποίηση.
  • Επεκτάσιμα μαθήματα δεν θα πρέπει να είναι σειριοποιημένο, εκτός κι αν είναι επιτακτικός.
  • Εσωτερικές τάξεις θα πρέπει να αποφεύγεται η συμμετοχή στη σειρά.

Με αυτό, φτάσαμε στο τέλος αυτού του άρθρου. Ελπίζω να έχετε κατανοήσει τα βασικά της Σειριοποίησης στην Java, τους τύπους και τις λειτουργίες της.

Δείτε το από την Edureka, μια αξιόπιστη διαδικτυακή εταιρεία εκμάθησης με δίκτυο περισσότερων από 250.000 ικανοποιημένων μαθητών σε όλο τον κόσμο. Το μάθημα εκπαίδευσης και πιστοποίησης Java J2EE και SOA της Edureka έχει σχεδιαστεί για φοιτητές και επαγγελματίες που θέλουν να γίνουν προγραμματιστές Java. Το μάθημα έχει σχεδιαστεί για να σας δώσει μια πρώτη αρχή στον προγραμματισμό Java και να σας εκπαιδεύσει τόσο για βασικές όσο και για προχωρημένες ιδέες Java μαζί με διάφορα πλαίσια Java όπως το Hibernate & Ανοιξη .

Έχετε μια ερώτηση για εμάς; Αναφέρετέ το στην ενότητα σχολίων αυτού του άρθρου 'Serialization in Java' και θα επικοινωνήσουμε μαζί σας το συντομότερο δυνατό.