सीरियलायझेशन ही जावा मधील सर्वात शक्तिशाली परंतु गोंधळात टाकणारी संकल्पना आहे. अनुभवी जावा प्रोग्रामर देखील सीरियलायझेशन योग्य करण्यासाठी संघर्ष करतात. सीरियलायझेशन यंत्रणा जावा सॉफ्टवेअरद्वारे ऑब्जेक्टची स्थिती पुनर्संचयित करण्यासाठी प्रदान केली जाते. जावा दोन वर्ग प्रदान करते अनुक्रमांक: आणि बाह्य: मध्ये: java.io: ही प्रक्रिया सुलभ करण्यासाठी दोन्ही पॅकेजेस आहेत मार्कर इंटरफेस म्हणजे, कोणत्याही पद्धतीच्या इंटरफेसशिवाय. जावा मध्ये, ऑब्जेक्ट सीरियलायझेशन म्हणजे वायर गेज मध्ये रूपांतरित करणे जेणेकरून आपण ते स्थानिक फाइलमध्ये टिकवून ठेवू शकता किंवा नेटवर्कवरून दुसऱ्या क्लायंटला हस्तांतरित करू शकता, त्यामुळे अनेक JVM मध्ये वितरित केलेल्या वितरित अनुप्रयोगांमध्ये ही एक अतिशय महत्वाची संकल्पना बनते.

जावा मध्ये, इतर वैशिष्ट्ये आहेत, जसे की रिमोट मेथड इनव्होकेशन (RMI) किंवा HttpSession Servlet API, ज्यासाठी सहभागी ऑब्जेक्ट करणे आवश्यक आहे अनुक्रमांक: इंटरफेस, कारण ते प्रसारित केले जाऊ शकतात – नेटवर्कवर संग्रहित.

या लेखात, मी जावा मधील सामान्य हेतू ऑब्जेक्टचे साधे उदाहरण घेऊन सीरियलायझेशन և प्रक्रियेची संकल्पना स्पष्ट करण्याचा प्रयत्न केला आहे. आमच्याकडे एक धडा आहे: शूज:, जे शूजचे प्रतिनिधित्व करते ज्यात नमुना व्हेरिएबल आहे जे ब्रँडचे प्रतिनिधित्व करण्यासाठी आयडी, रंग և आकार, ատ स्थिर व्हेरिएबल दर्शवते. मी दोन्ही समाविष्ट केले आहे क्षणिक आणि स्थिर हे फील्ड सीरियलायझेशन प्रक्रियेत साठवले जात नाहीत हे सिद्ध करण्यासाठी चल.

आपण ते देखील वाचू शकता! धडा एक जावा: जावा मधील सीरियलायझेशनच्या तपशीलांबद्दल अधिक जाणून घ्या. त्यांनी अनु क्रमणिका विषय योग्यरित्या कव्हर केला, जास्त तपशीलांसह किंवा थोड्या स्पष्टीकरणासह. मी तिथून बरेच उपयुक्त तपशील शिकलो.

मी ऑब्जेक्टची स्थिती पुनर्संचयित करण्यासाठी अनुक्रमांकनाच्या उलट प्रक्रियेचे स्पष्टीकरण देखील दिले, म्हणजेच अनुक्रमांक – का SerialVersionUID: अनुक्रमांकित कोणत्याही वर्गासाठी वापरला जाऊ शकतो. जेव्हा आपण एखादी वस्तू पुनर्संचयित करतो, तेव्हा अनुक्रमांक करण्यापूर्वी मूल्यांची तुलना करण्यासाठी आम्ही त्याची स्थिती मुद्रित करतो. हे आपल्याला जावामध्ये ऑब्जेक्ट कसे जतन आणि पुनर्संचयित करू शकते याची स्पष्ट कल्पना देईल.

आणि जर तुम्ही जावा जगात नवीन असाल तर मला स्विच करण्याचा सल्ला देखील दिला जातो जावा मास्टरक्लास पूर्ण करा चांगल्या संरचित मार्गाने जावा शिका. हा जावा मधील सर्वोत्तम ऑनलाइन शिक्षण अभ्यासक्रमांपैकी एक आहे.

सीरियलाइझ करण्यायोग्य इंटरफेससाठी ऑब्जेक्ट सीरियलाइझ करण्यायोग्य जावा प्रोग्राम

जावामध्ये ऑब्जेक्टचे क्रमबद्ध և डी-सीरियलाइझ कसे करावे हे दर्शविण्यासाठी आमचा जावा प्रोग्राम येथे आहे. या कार्यक्रमात दोन धडे आहेत शूज: आणि क्रमिकरण डेमो:, पहिला धडा आमचा POJO आहे, आम्ही या धड्याचा ऑब्जेक्ट तयार करू – आम्ही ते सुरू ठेवू.

दुसरा धडा आमचा व्यावहारिक धडा आहे, ज्यात समाविष्ट आहे: मुख्य () पद्धत, ऑब्जेक्ट तयार करण्यासाठी, राखण्यासाठी և शेवटी, मुख्य पद्धतीमध्ये लिहिलेला संपूर्ण कोड.

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.logging.Logger;

/**
 * Simple example of Serialization in Java. We first create a Shoe object, then
 * serializes it and finally restored it by using de-serialization.
 *
 * @author Javin Paul
 */
public class Pattern {

    public static void main(String args[]) throws IOException, 
                               ClassNotFoundException {
        Shoe whiteNikeShoe = new Shoe("Nike", 1000, 9, "WHITE", true);
        System.out.println("Before Serialization");
        whiteNikeShoe.print();

        // serializing shoe object
        writeShoe(whiteNikeShoe);

        // creating another Shoe with different brand
        Shoe blackAdidasShoe = new Shoe("Adidas", 2000, 8, "Black", true);
        
        
        // deserializing shoe object
        whiteNikeShoe = (Shoe) readShoe();

        System.out.println("After DeSerialization");
        whiteNikeShoe.print();
    }

    private static void writeShoe(Serializable shoe) throws IOException {
        ObjectOutputStream oos = new ObjectOutputStream(
                        new FileOutputStream(new File("shoe.ser")));
        oos.writeObject(shoe);
        oos.close();
    }

    private static Object readShoe() throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(
                        new FileInputStream(new File("shoe.ser")));
        Object obj = ois.readObject();
        return obj;
    }

}

class Shoe implements Serializable {

    // static final variable
    private static final long serialVersionUID = 40L;
    private static final Logger logger = Logger.getLogger(Shoe.class.getName());

    // static variable but not final
    private static String _brand;

    // instance variable
    private int _id;
    private int _size;
    private String _color;

    // transient variable
    private transient boolean _isRunningShoe;

    // non serializable field
    Thread _thread;

    public Shoe(String brand, int id, int size, String color, 
                                      boolean isRunningShoe) {
        System.out.println("Inside Constructor");
        _brand = brand;
        _id = id;
        _size = size;
        _color = color;
        _isRunningShoe = isRunningShoe;

    }

    public String brand() {
        return _brand;
    }

    public int id() {
        return _id;
    }

    public int size() {
        return _size;
    }

    public String color() {
        return _color;
    }

    public void print() {
        System.out.println("SerialVersionUID (final static field) : "
                            + serialVersionUID);
        System.out.println("logger ((final static field) : " + logger);
        System.out.println("_brand (static field) : " + _brand);
        System.out.println("_id (instance variable) : " + _id);
        System.out.println("_size (instance variable) : " + _size);
        System.out.println("_color (instance variable) : " + _color);
        System.out.println("_isRunningShoed (transient variable) : " 
                              + _isRunningShoe);
        System.out.println("_thread (non-serializable field) : " + _thread);

    }

}

Output
Inside Constructor
Before Serialization
SerialVersionUID (final static field) : 40
logger ((final static field) : java.util.logging.Logger@42aab87f
_brand (static field) : Nike
_id (instance variable) : 1000
_size (instance variable) : 9
_color (instance variable) : WHITE
_isRunningShoed (transient variable) : true
_thread (non-serializable field) : null
Inside Constructor
After DeSerialization
SerialVersionUID (final static field) : 40
logger ((final static field) : java.util.logging.Logger@42aab87f
_brand (static field) : Adidas
_id (instance variable) : 1000
_size (instance variable) : 9
_color (instance variable) : WHITE
_isRunningShoed (transient variable) : false
_thread (non-serializable field) : null

एक चित्र हजार शब्दांचे आहे

निरीक्षण և स्पष्टीकरण

आता आपण एका उदाहरणाला अनुक्रमांकित केल्यावर काय झाले हे समजून घेण्याचा प्रयत्न करूया शूज: և नंतर, जेव्हा आम्ही ते सीरियल केले. या धड्यात, मी क्रमवारी दरम्यान त्यांचे मूल्य साठवले आहे किंवा पुनर्संचयित केले आहे हे दर्शविण्यासाठी विविध प्रकारचे व्हेरिएबल्स तयार केले.

मध्ये: शूज: वर्ग, आमच्याकडे दोन आहेत स्थिर अंत फील्ड, SerialVersionUID:, և: लॉगर; त्यांची मूल्ये जपली जात नाहीत, परंतु ती स्थिर असल्यामुळे. जेव्हा धडा अपलोड केला जातो तेव्हा ते पूर्व-स्वाक्षरी केलेले असतात, म्हणून ते ठीक असतात. तसेच, ते अंतिम असल्याने, कोणीही त्यांचे मूल्य बदलण्याचा धोका नाही.

हे: SerialVersionUID: अनुक्रमांकित वर्गासाठी हे एक अतिशय महत्वाचे क्षेत्र आहे, ते नेहमी परिभाषित केले पाहिजे. आपण निर्दिष्ट न केल्यास, JVM वर्गमूल्यांची संख्या, त्यांचे प्रकार वगैरे वाचून हे मूल्य मोजेल.

याचा अर्थ असा की पुढच्या वेळी तुम्ही दुसरे व्हेरिएबल जोडाल किंवा जुने काढून टाकाल तेव्हा तुम्ही दुसरे व्हेरिएबल मिळवण्याचा धोका चालवाल. SerialVersionUID: : असे झाल्यास, तुम्ही तुमच्या प्रोग्रामच्या मागील आवृत्तीत सेव्ह केलेली ऑब्जेक्ट रिस्टोअर करू शकणार नाही.

हे प्रत्यक्षात आमच्या बाबतीत घडले जेव्हा एका विकासकाने चुकून SerialVersionUID वापरकर्त्याच्या प्राधान्य वर्गांपैकी एकामधून काढून टाकला, the जेव्हा वापरकर्ता डाउनलोड करत होता – आमच्या जावा अनुप्रयोगाची नवीन आवृत्ती चालवत होता, तेव्हा त्याची प्राधान्ये सर्व नाहीशी झाली.

तो एक व्यापारी होता, त्यांच्या आवडीनिवडी त्यांच्यासाठी खूप महत्त्वाच्या होत्या, त्याची GUI मागील आवृत्तीवर परत येण्याआधी, त्याच्या आवडीनिवडी पुनर्संचयित करण्यापूर्वी त्याला सांत्वन आणि शांत करणे कठीण वेळ होती. मला खात्री आहे की आपण कधीही आपल्या ग्राहकांना upset वापरकर्त्याला अस्वस्थ करू इच्छित नाही.

मालिका अशा तपशीलांनी भरलेली आहे, և मी osh oshua Bloch चा सल्ला वाचण्याची शिफारस करतो प्रभावी जावा प्रत्यक्ष कार्यक्रमात लागू करण्यापूर्वी अनुक्रमांशी संबंधित. या डेमो कार्यक्रमाच्या व्यतिरीक्त և की सेरलिजेबल यशस्वीरित्या successfully यशस्वीपणे अंमलात आणण्यासाठी या अमूल्य टिपा आहेत.

जावा मध्ये अनुक्रमांक करण्याचा सर्वोत्तम सराव

आता काहीतरी साधे करू, नॉन-फायनल स्टॅटिक व्हेरिएबल, त्याचे मूल्य देखील अनुक्रमांक दरम्यान जतन केले जात नाही, म्हणूनच आपण पाहता _ ब्रँड = नायकी अनुक्रमांक करण्यापूर्वी _ ब्रँड = एडिडास नंतर:

हे का घडले हे तुम्हाला माहिती आहे का? कारण जेव्हा आम्ही अॅडिडाससाठी दुसरे शू मॉडेल तयार केले, तेव्हा आम्ही या व्हेरिएबलचे मूल्य अॅडिडासवर रीसेट केले – कारण नोटाबंदीच्या वेळी कन्स्ट्रक्टरला बोलावले जात नाही, և वर्ग रीलोड केलेला नाही, त्याचे मूल्य idडिडासकडे राहते. ते असू शकते रिक्त जर JVM च्या दुसर्या उदाहरणात डी-सिरीयलायझेशन झाले.

आता आमची तीन उदाहरणे व्हेरिएबल्स पाहू: _id, _size և _color, ज्यांची मूल्ये अनुक्रमांक दरम्यान साठवली जातात de डी-सीरियलायझेशन दरम्यान पुनर्संचयित केली जातात. म्हणूनच आपल्याला या तीन क्षेत्रांसाठी योग्य मूल्ये दिसतात. पुढे आमचे आहे क्षणिक चल isRunningShoe:, हे गुंतागुंतीचे आहे, क्षणिक व्हेरिएबलचे मूल्य अनुक्रमांक दरम्यान संग्रहित केले जात नाही, म्हणून मूल्य isRunningShoe: सीरियलायझेशननंतर चुकीचे आहे.

ते होते ते बरोबर आहे आधी, पण बनले बनावट सीरियलायझेशननंतर. आपण हे लक्षात घेतले नसते की जर तो बैल व्हेरिएबलचा उगम झाला असेल तर: बनावट, և तुम्हाला असे वाटेल की: क्षणिक चलचे मूल्य राखले गेले – पुनर्संचयित केले, जे खरे नाही. म्हणून सीरियलायझेशन दरम्यान चल म्हणून डीफॉल्ट मूल्यांपासून सावध रहा स्थिर आणि क्षणिक अनुक्रमांकानंतर, ते त्यांच्या डीफॉल्ट मूल्यावर सुरू होतील.

नंतरचे हे आमच्या नॉन-सिरीयलायझेशन व्हेरिएबलचे उदाहरण आहे धागा, ज्यात नमुना आहे java.lang.Thread:, जे अंमलात आणत नाही अनुक्रमांक: इंटरफेस: हे खरोखरच मनोरंजक आहे डीफॉल्ट अनुक्रमांक प्रक्रिया या व्हेरिएबलबद्दल तक्रार करत नाही, आपण पुरेसे लक्ष न दिल्यास हे समजणे देखील कठीण होऊ शकते. ते कारण होते की व्हेरिएबल कोणतेही मूल्य धारण करत नाही.

आता फक्त त्या व्हेरिएबलला प्रारंभ करा: विषय _ विषय = नवीन विषय () արկել प्रोग्राम रीस्टार्ट करा. यावेळी त्याला खालील अपवाद मिळेल.

Exception in thread "main" java.io.NotSerializableException: java.lang.Thread
 at java.io.ObjectOutputStream.writeObject0(Unknown Source)
 at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
 at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
 at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
 at java.io.ObjectOutputStream.writeObject0(Unknown Source)
 at java.io.ObjectOutputStream.writeObject(Unknown Source)
 at SerializationDemo.writeShoe(HelloHP.java:42)
 at SerializationDemo.main(HelloHP.java:28)

कारण थीम ए लागू करत नाही अनुक्रमांकित इंटरफेस, आपण ते अनुक्रमांकित करू शकत नाही. लेगसी जावा अनुप्रयोग सांभाळताना ही एक अतिशय सामान्य समस्या आहे. समजा तुमच्याकडे Serializable वर्ग आहे कर्मचारी:, आणि एका विकसकांनी नंतर दुसरे व्हेरिएबल उदाहरण सादर केले विभाग:, जे अनुक्रमांक करण्यायोग्य नाही. तुम्हाला माहिती आहे काय होईल? कर्मचार्याला यापुढे अनुक्रमांकित करता येणार नाही!

म्हणूनच मी ए स्थापित करण्याची शिफारस करतो क्रमवाचक अलार्म सीरिअलायझेबल क्लास सोर्समध्ये, त्यांना आठवण करून द्या की कोणतेही सिरीयलाइझ करण्यायोग्य व्हेरिएबल्स जोडू नयेत किंवा खरोखर गरज असल्यास ते क्षणिक बनवू नका. आपण पाहू शकता जावा एन्कोडिंग मार्गदर्शक अधिक कोडिंग सर्वोत्तम पद्धतींसाठी जावा अनुप्रयोग लिहिताना. यात विश्वसनीय -सुरक्षित जावा अनुप्रयोगांसाठी 75 शिफारसी आहेत.

एका शब्दात, आम्ही म्हणू शकतो.

  • स्थिर व्हेरिएबलचे मूल्य अनुक्रमांक दरम्यान संग्रहित केले जात नाही.
  • संक्रमण व्हेरिएबल्स देखील संग्रहित नाहीत.
  • स्थिर किंवा क्षणिक नसलेले कोणतेही वगळलेले नॉन-सीरियलाइझ करण्यायोग्य फील्ड av.io.NotSerializableException फेकून सीरियलायझेशन प्रक्रिया खंडित करेल.
  • सीरियलायझेशनसाठी वर्गाच्या कन्स्ट्रक्टरला सीरियलायझेशन दरम्यान म्हटले जात नाही.

एवढे Serializable इंटरफेस वापरून जावा मध्ये ऑब्जेक्टचे क्रम कसे लावायचे. सीरियलायझेशनद्वारे ऑब्जेक्ट्सची क्रमवारी, पुनर्प्राप्ती आणि पुनर्प्राप्ती, तसेच जावामध्ये अनुक्रमांक कार्याशी संबंधित काही मूलभूत संकल्पना आम्ही पाहिल्या आहेत.

उदाहरणार्थ, सीरियलायझेशन दरम्यान क्षणिक-स्थिर व्हेरिएबल्स साठवले जात नाहीत; जर तुम्ही स्थिर व्हेरिएबल घोषित केले तर ते अंतिम नाही याची खात्री करा;

या सर्व संकल्पना आपल्या कार्यक्रमात योग्य क्रमवारी लावण्यासाठी खूप महत्वाच्या आहेत. आपण नंतर वाचू शकता प्रभावी जावा जोशुआ ब्लॉच द्वारे प्रभावी क्रमबद्धता समजून घेण्यासाठी, उदाहरणार्थ, सामान्य बायनरी डिमरसह. या पुस्तकातील अनुक्रमांशी संबंधित सर्व मुद्दे कोणत्याही गंभीर जावा प्रोग्रामरने वाचले पाहिजेत.

अतिरिक्त प्रशिक्षण
जावा मास्टर क्लास पूर्ण करा
जावा मूलभूत. जावा भाषा:
जावाच्या खोलीत. पूर्ण जावा अभियंता व्हा.

इतर: जावा सिरीयलायझेशन ट्यूटोरियल तुम्हाला अभ्यास करायला आवडेल

  • प्रत्येक जावा डेव्हलपरला सिरीयलायझेशनबद्दल काय माहित असणे आवश्यक आहे (वाचा:)
  • जावा मध्ये “बाहेरील” अनुक्रमांक करण्यायोग्य फरक. (उत्तर:)
  • जावा मध्ये SerialVersionUID का वापरावे? (उत्तर:)
  • गूगल प्रोटोकॉल बफर – जावा मध्ये सीरियलायझेशनचा एक द्रुत पर्याय. (शैक्षणिक:)
  • जावा मध्ये क्षणिक “अस्थिर चल” मधील फरक. (उत्तर:)
  • Serializable वर्गात क्षणिक चल कसे वापरावे? (उत्तर:)

हा लेख आतापर्यंत वाचल्याबद्दल धन्यवाद. जर तुम्हाला जावा सीरियलायझेशन ट्यूटोरियल जमीन वर्णन आवडत असेल, तर ते तुमच्या मित्र -सहकाऱ्यांसह शेअर करा. आपल्याकडे काही प्रश्न किंवा अभिप्राय असल्यास, कृपया एक टीप लिहा.