Java में Serialization का उद्देश्य क्या है?


105

मैंने धारावाहिक पर बहुत सारे लेख पढ़े हैं और यह कितना अच्छा और शानदार है लेकिन कोई भी तर्क पर्याप्त नहीं था। मैं सोच रहा हूं कि क्या कोई मुझे वास्तव में बता सकता है कि ऐसा क्या है जो हम वास्तव में एक वर्ग को क्रमबद्ध करके प्राप्त कर सकते हैं?


10
उनके तर्कों के बारे में क्या "आश्वस्त" नहीं था? और आपने अपने सवालों के जवाब क्यों नहीं स्वीकार किए हैं?
आनन।

8
वह "आश्वस्त नहीं था" उन्होंने उसके सवालों का जवाब दिया।
एंथनी फोर्लोनी

5
प्रदान किए गए उत्तर वास्तव में सही थे। यदि वे आपके लिए काम नहीं करते हैं, तो उन्हें टिप्पणियों के रूप में उत्तर दें और उन्हें अनदेखा करने के बजाय इसे बाहर काम करने की कोशिश करें और फिर दूसरों को लौ देना शुरू करें जब वे बताते हैं कि आप एसओ अधिकार का उपयोग नहीं कर रहे हैं।
आनन।

4
डुप्लिकेट प्रश्नों को हतोत्साहित करके एनॉन साइट की गुणवत्ता में योगदान दे रहा है। यह मूर्खतापूर्ण है कि पांच अलग-अलग प्रश्न देखें जो सभी एक ही बात पूछ रहे हैं। अगर आपको कोई जवाब नहीं मिल रहा है, तो कभी-कभी बस इतना ही। यदि आपको उत्तर मिलता है, लेकिन यह काम नहीं करता है, तो टिप्पणियों में चर्चा जारी रखें। SO एक मैजिक बॉक्स नहीं है जो जादुई रूप से आपको एक उत्तर देगा यदि आप सिर्फ सही प्रश्न पूछते हैं, या पर्याप्त समय पूछते हैं, या सही विशेषज्ञ की नज़र को पकड़ते हैं।
क्रिस

1
या तो: (उत्तर स्वीकार करें) या (एक टिप्पणी पोस्ट करें और / या यह स्पष्ट करते हुए प्रश्न पूछें कि यह आपकी आवश्यकता क्यों नहीं है)।
आनन।

जवाबों:


182

पहले क्रमांकन को परिभाषित करते हैं, फिर हम इस बारे में बात कर सकते हैं कि यह इतना उपयोगी क्यों है।

Serialization बस एक मौजूदा ऑब्जेक्ट को बाइट सरणी में बदल रहा है। यह बाइट सरणी ऑब्जेक्ट के वर्ग, ऑब्जेक्ट के संस्करण और ऑब्जेक्ट की आंतरिक स्थिति का प्रतिनिधित्व करता है। इस बाइट सरणी का उपयोग तब जेवीएम द्वारा ऑब्जेक्ट को प्रसारित / पढ़ने के लिए समान कोड चलाने के बीच किया जा सकता है।

हम ऐसा क्यों करना चाहेंगे?

इसके कई कारण हैं:

  • संचार: यदि आपके पास दो मशीनें हैं जो समान कोड चला रही हैं, और उन्हें संचार करने की आवश्यकता है, तो एक आसान तरीका यह है कि एक मशीन एक ऐसी वस्तु के निर्माण के लिए है जिसमें यह जानकारी हो कि वह संचारित करना चाहती है, और फिर उस वस्तु को दूसरी मशीन से अनुक्रमित करें। यह संचार के लिए सबसे अच्छा तरीका नहीं है, लेकिन यह काम पूरा कर लेता है।

  • दृढ़ता: यदि आप किसी डेटाबेस में किसी विशेष ऑपरेशन की स्थिति को संग्रहीत करना चाहते हैं, तो इसे आसानी से बाइट सरणी में अनुक्रमित किया जा सकता है, और बाद में पुनर्प्राप्ति के लिए डेटाबेस में संग्रहीत किया जा सकता है।

  • डीप कॉपी: यदि आपको किसी ऑब्जेक्ट की एक सटीक प्रतिकृति की आवश्यकता है , और आप अपने स्वयं के विशेष क्लोन () वर्ग को लिखने की परेशानी में नहीं जाना चाहते हैं, तो बस ऑब्जेक्ट को बाइट सरणी में क्रमबद्ध करें, और फिर इसे दूसरे को डी-सीरियल करें। वस्तु इस लक्ष्य को प्राप्त करती है।

  • कैशिंग: वास्तव में सिर्फ उपरोक्त का एक अनुप्रयोग है, लेकिन कभी-कभी एक वस्तु के निर्माण में 10 मिनट लगते हैं, लेकिन डी-सीरियल करने में केवल 10 सेकंड लगेंगे। इसलिए, स्मृति में विशाल वस्तु को पकड़ने के बजाय, इसे क्रमांकन के माध्यम से एक फ़ाइल में कैश करें, और बाद में इसे तब पढ़ें जब इसकी आवश्यकता हो।

  • क्रॉस JVM सिंक्रोनाइज़ेशन: विभिन्न JVM में सेरिअलाइजेशन काम करता है जो विभिन्न आर्किटेक्चर पर चल सकता है।


62
पृथ्वी पर क्या बनाने में 10 मिनट लगते हैं?
oxbow_lakes

2
मेरी बात (निश्चित रूप से) कि फ़ाइल I / O धारावाहिकीकरण में शामिल है, संभवतः किसी शुद्ध वस्तु निर्माण उपरि को बौना कर देगा। मुझे लगता है कि आप वैज्ञानिक मॉडलिंग की तरह कम्प्यूटेशनल रूप से बहुत महंगे कुछ के बारे में बात कर सकते हैं, लेकिन
क्रमिकता

11
यदि आप तेजी से खोज के लिए डेटा के किसी विशेष सेट का एक सूचकांक बनाए रखते हैं तो @oxbow_lakes एक उदाहरण हो सकता है। इस तरह का एक इंडेक्स बनाने में बहुत लंबा समय लग सकता है, लेकिन एक बार जब आप इसे बना लेते हैं तो इसे अपेक्षाकृत जल्दी सीरियलाइज्ड / डी-सीरियल किया जा सकता है।
डेविड

यदि वेब ऐप अनुरोध को गंतव्य तक पहुंचने से पहले दुनिया के प्रत्येक राउटर से गुजरना पड़ता है, तो ऑब्जेक्ट का निर्माण करना, सबसे लंबे समय तक संभव पथ का उपयोग करके ऑब्जेक्ट के साथ वापस आना, हाँ इसमें 10 मिनट लग सकते हैं।
वैब्स

@ शशमेलर, चूंकि आपने संचार के लिए सीरियलाइज़ेशन का सबसे अच्छा तरीका नहीं बताया है, जो कि उपयुक्त और फिर लागू की जाने वाली सबसे अच्छी विधि है?
अश्फाक रिफ़ेय

58

जब आप अपना एप्लिकेशन चला रहे हों, तो उसकी सभी ऑब्जेक्ट्स मेमोरी (RAM) में स्टोर हो जाती हैं। जब आप बाहर निकलते हैं, तो वह मेमोरी ऑपरेटिंग सिस्टम द्वारा पुनः प्राप्त हो जाती है, और आपका प्रोग्राम अनिवार्य रूप से सब कुछ भूल जाता है जो कि चल रहा था। आपके एप्लिकेशन को डिस्क पर सहेजने की अनुमति देकर इसे सीरियलाइज़ेशन उपचार करता है ताकि यह अगली बार शुरू होने पर उन्हें वापस पढ़ सके। यदि आपका एप्लिकेशन पिछली स्थिति को सहेजने / साझा करने का कोई तरीका प्रदान करने जा रहा है, तो आपको किसी प्रकार के क्रमांकन की आवश्यकता होगी।


2
तो, ऐसा लगता है कि यह एक फ़ाइल में डेटा लिखने और जरूरत पड़ने पर इसे पढ़ने का सिर्फ एक बेहतर, अधिक कुशल तरीका है?
m_a_khan

1
यह एकमात्र वास्तविक स्पष्टीकरण है। मैं क्रमांकन +1 के किसी अन्य वास्तविक विश्व अनुप्रयोग के बारे में नहीं सोच सकता
एमिली

छोटा एवं सुन्दर। एकदम सही व्याख्या।
यखूबू

21

मैं अपनी कहानी साझा कर सकता हूं और मुझे उम्मीद है कि यह कुछ विचार देगा कि क्रमांकन क्यों आवश्यक है। हालाँकि, आपके प्रश्न के उत्तर पहले से ही उल्लेखनीय हैं।

मेरे पास कई परियोजनाएं थीं जिन्हें टेक्स्ट फ़ाइलों का एक गुच्छा लोड करने और पढ़ने की आवश्यकता है। फाइलों में स्टॉप शब्द, बायोमेडिकल वर्ब, बायोमेडिकल संक्षिप्ताक्षर, शब्द एक-दूसरे से शब्दबद्ध रूप से जुड़े हुए हैं, आदि इन फाइलों की सामग्री सरल है: शब्द !

अब प्रत्येक परियोजना के लिए, मुझे इन फ़ाइलों में से प्रत्येक से शब्दों को पढ़ने और उन्हें विभिन्न सरणियों में डालने की आवश्यकता थी; जैसा कि फ़ाइल की सामग्री कभी नहीं बदली, यह पहली परियोजना के बाद एक आम, लेकिन निरर्थक, कार्य बन गया।

इसलिए, मैंने जो किया वह यह है कि मैंने इनमें से प्रत्येक फाइल को पढ़ने के लिए और व्यक्तिगत सरणियों (वस्तुओं के उदाहरण चर) को पॉप्युलेट करने के लिए एक ऑब्जेक्ट बनाया। फिर मैंने वस्तुओं को क्रमबद्ध किया और फिर बाद की परियोजनाओं के लिए, मैंने बस उन्हें निष्क्रिय कर दिया। मुझे फाइलें पढ़ने और बार-बार सरणियों को आबाद करने की जरूरत नहीं थी।


1
ऐसे मामले में, आपको उन्हें बाइट एरे स्ट्रीम (सीरियलाइज़ का उपयोग करके) में संग्रहीत करने की आवश्यकता क्यों है, क्या यह केवल एक अस्थायी क्षेत्र का उपयोग करने की तुलना में अधिक सरल हो सकता है?
kidnan1991

3

सार में :

सीरियलाइज़ेशन ऑब्जेक्ट इंस्टेंस के एक सेट को परिवर्तित करने की प्रक्रिया है जिसमें एक दूसरे को बाइट्स की रैखिक धारा में संदर्भित किया जाता है, जिसे तब सॉकेट के माध्यम से भेजा जा सकता है, जो एक फ़ाइल में संग्रहीत किया जाता है, या बस डेटा की एक धारा के रूप में हेरफेर किया जाता है।

विकी से उपयोग देखें :

सीरियलाइजेशन के कई फायदे हैं। यह प्रावधान:

  1. उन वस्तुओं को बनाए रखने की एक विधि जो डिस्क पर एक टेक्स्ट फ़ाइल के लिए उनके गुणों को लिखने से अधिक सुविधाजनक है, और इस में वापस पढ़ने के द्वारा उन्हें फिर से इकट्ठा करना।
  2. दूरस्थ प्रक्रिया कॉल जारी करने की एक विधि, उदाहरण के लिए, सोप में
  3. वस्तुओं को वितरित करने की एक विधि, विशेष रूप से सॉफ़्टवेयर घटक जैसे COM, CORBA, आदि में।
  4. समय-भिन्न डेटा में परिवर्तनों का पता लगाने के लिए एक विधि।

1

सबसे स्पष्ट यह है कि आप नेटवर्क पर क्रमबद्ध वर्ग को प्रसारित कर सकते हैं, और प्रापक मूल इंस्टेंस्ट के डुप्लिकेट का निर्माण कर सकता है। इसी तरह, आप एक फ़ाइल सिस्टम के लिए एक धारावाहिक संरचना को बचा सकते हैं।

इसके अलावा, ध्यान दें कि क्रमबद्धता पुनरावर्ती है, इसलिए यदि आप चाहें, तो आप एक स्वेल फूप में संपूर्ण विषम डेटा संरचना को क्रमबद्ध कर सकते हैं।


0

सीरियलाइज्ड ऑब्जेक्ट्स अंतरिक्ष में स्थिति बनाए रखते हैं, उन्हें नेटवर्क, फाइल सिस्टम, आदि ... और समय पर स्थानांतरित किया जा सकता है, वे उन जेवीएम को रेखांकित कर सकते हैं जिन्होंने उन्हें बनाया था।

कभी-कभी यह उपयोगी है।


यह एक साधारण फ़ाइल के साथ प्राप्त किया जा सकता है जिसमें कुछ पाठ भी होते हैं। धारावाहिक वस्तु को वापस पढ़ना थोड़ा आसान है, फिर पाठ फ़ाइल में लिखी गई वस्तु की स्थिति को पढ़ना, सही है?
m_a_khan

@m_a_khan: वाह। हाँ यह एक साधारण पाठ के साथ किया जा सकता है। लेकिन जैसे ही वस्तुएं अधिक जटिल हो जाती हैं, या उनकी संरचनाएं (रचना, विरासत) बेहतर हो जाती हैं, और अधिक जटिल हो जाता है, यह उन्हें मैन्युअल रूप से (संयुक्त राष्ट्र) के लिए एक परेशानी बन जाएगा। ऑब्जेक्ट सदस्यों के रूप में सूची, सेट और नक्शे होने की कल्पना करें।
डिर्क शूमाकर

विभिन्न क्रमांकन योजनाओं के साथ आना आसान है और वास्तव में कई मौजूद हैं। बहुत अच्छे कारणों से, उनमें से कोई भी सामान्य मामले में परिणाम नहीं देता है, "सरल पाठ" में
डेविड सोरोको

0

मैं फंक्शंस या क्लास कंस्ट्रक्टर्स के पास जाने वाले तर्कों को मानकीकृत करने के लिए क्रमबद्ध वस्तुओं का उपयोग करता हूं। एक क्रमिक बीन पास करना तर्कों की लंबी सूची की तुलना में बहुत साफ है। परिणाम कोड है जो पढ़ने और डिबग करने में आसान है।


1
मेरी राय में एक पैरामीटर के रूप में एकल कॉन्फ़िगरेशन ऑब्जेक्ट का उपयोग करना काफी महत्वपूर्ण है। संभवतः यह एक विशिष्ट उपयोग का मामला नहीं है।
गैबोर बाकोस

0

सीखने के सरल उद्देश्य के लिए (नोटिस, मैंने कहा सीखने के लिए, मैंने सबसे अच्छा, या यहां तक ​​कि अच्छा नहीं कहा, लेकिन सिर्फ सामान को समझने के लिए), आप अपने डेटा को कंप्यूटर पर पाठ फ़ाइल में सहेज सकते हैं, फिर एक कार्यक्रम है उस जानकारी को पढ़ता है, और फ़ाइल के आधार पर, आप अपने कार्यक्रम को अलग तरह से प्रतिक्रिया दे सकते हैं। यदि आप अधिक उन्नत थे, तो जरूरी नहीं कि यह एक txt फ़ाइल हो, लेकिन कुछ और।

दूसरी ओर सीरियल करना, चीजों को सीधे कंप्यूटर की भाषा में डालता है। यह ऐसा है जैसे आप स्पैनिश में स्पैनिश कंप्यूटर को कुछ बता रहे हैं, बजाय इसे फ्रेंच में कुछ कहने के, इसे फ्रेंच सीखने के लिए मजबूर कर रहे हैं, फिर सब कुछ अनुवाद करके अपने मूल स्पैनिश में चीजों को बचाएं। सबसे तकनीकी-गहन उत्तर नहीं, मैं केवल एक सामान्य भाषा प्रारूप में एक समझने योग्य उदाहरण बनाने की कोशिश कर रहा हूं।

सीरियलाइज़ेशन भी तेज़ है, क्योंकि जावा में, ऑब्जेक्ट्स को ढेर पर संभाला जाता है, और अगर स्टैक पर प्राइमिटिव के रूप में प्रतिनिधित्व किया गया था तो इससे अधिक समय लगता है। गति, गति, गति। और प्रोग्रामर के दृष्टिकोण से कम फ़ाइल प्रसंस्करण।


सादे अंग्रेजी में चीजों को रखने का प्रयास करते हुए, आपने वास्तव में किसी भी उपयोगी तरीके से क्रमांकन नहीं समझाया है।
user3516726
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.