जावा क्रमांकन - फायदे और नुकसान, उपयोग या परहेज? [बन्द है]


20

जावा में दृढ़ता के लिए सीरियल का उपयोग किया जाता है। क्रमांकन का उपयोग करके कुछ वस्तुओं को जारी रखना ठीक हो सकता है। लेकिन, बड़ी संख्या में वस्तुओं के लिए, ORM, डेटाबेस आदि बेहतर हो सकते हैं। ऐसा लगता है कि लघुकरण केवल छोटी नौकरियों के लिए उपयोगी है। शायद मैं गलत हूँ। तो कृपया मुझे बताएं कि गैर-क्रमांकन विधियों पर क्रमांकन के फायदे क्या हैं? इसका उपयोग कब किया जाना चाहिए और इसे कब टाला जाना चाहिए?

यह सवाल मेरे दिमाग में आया कि DZone आर्टिकल क्या ऑब्जेक्ट सीरियलाइजेशन ईविल है?

और ये वो पंक्तियाँ हैं जिन्होंने मेरे प्रश्न को जन्म दिया:

यदि आप जावा और इसके सत्र ऑब्जेक्ट्स को देखते हैं, तो शुद्ध ऑब्जेक्ट क्रमांकन का उपयोग किया जाता है। यह मानते हुए कि एक आवेदन सत्र काफी कम समय का है, जिसका अर्थ है कुछ घंटों में, वस्तु क्रमांकन सरल, अच्छी तरह से समर्थित और सत्र की जावा अवधारणा में निर्मित है। हालाँकि, जब डेटा की अवधि अधिक समय तक रहती है, संभवतः दिन या सप्ताह, और आपको एप्लिकेशन के नए रिलीज़ के बारे में चिंता करनी होगी, तो क्रमिक रूप से बुराई जल्दी हो जाती है। जैसा कि कोई भी अच्छा जावा डेवलपर जानता है, यदि आप किसी वस्तु को क्रमबद्ध करने की योजना बनाते हैं, यहां तक ​​कि एक सत्र में भी, आपको केवल एक 1L नहीं, बल्कि एक वास्तविक क्रमांकन आईडी (serialVersionUID) की आवश्यकता है, और आपको सीरियल इंटरफ़ेस लागू करने की आवश्यकता है। हालांकि, अधिकांश डेवलपर्स जावा डिसेरिएलाइज़ेशन प्रक्रिया के पीछे के वास्तविक नियमों को नहीं जानते हैं। यदि आपकी वस्तु बदल गई है, तो ऑब्जेक्ट में साधारण फ़ील्ड जोड़ने से अधिक, यह संभव है कि सीरियल आईडी न बदले जाने पर भी जावा ऑब्जेक्ट को सही ढंग से डिसेर्बलाइज नहीं कर सकता है। अचानक, आप अपने डेटा को किसी भी लंबे समय तक प्राप्त नहीं कर सकते हैं, जो स्वाभाविक रूप से खराब है।

अब, इसे पढ़ने वाले डेवलपर्स कह सकते हैं कि वे कभी भी ऐसा कोड नहीं लिखेंगे जिससे यह समस्या हो। यह सच हो सकता है, लेकिन एक पुस्तकालय के बारे में जो आप उपयोग करते हैं या कुछ अन्य डेवलपर अब आपकी कंपनी द्वारा नियोजित नहीं हैं? क्या आप गारंटी दे सकते हैं कि यह समस्या कभी नहीं होगी? गारंटी देने का एकमात्र तरीका एक अलग क्रमांकन विधि का उपयोग करना है।


क्या आप इस बात पर थोड़ा विस्तार करना चाहेंगे कि विशेष रूप से संदर्भित लेख में आपके प्रश्न का क्या कारण है?
gnat

@gnat - सवाल के लिए लाइनों को जोड़ा।
आकाश स्क्रेपर

'न सिर्फ' के बारे में 1Lसही नहीं है।
user207421

जवाबों:


15

सीरियल का उपयोग ज्यादातर दो क्षेत्रों में किया जाता है:

  • दृढ़ता का प्रोटोटाइप

    बहुत अधिक हर वस्तु ग्राफ को जल्दी से सीरियल-योग्य बनाया जा सकता है, त्वरित प्रूफ-ऑफ-कॉन्सेप्ट या त्वरित-और-गंदे अनुप्रयोगों के लिए यह वास्तविक ORM परत या अन्य दृढ़ता प्रणाली स्थापित करने से तेज हो सकता है

  • लगभग-मनमानी वस्तुओं का अल्पकालिक भंडारण:

    अनुप्रयोग सर्वर, उदाहरण के लिए, क्रमांकन का उपयोग करके सत्र की जानकारी को बनाए रखने की प्रवृत्ति है। इसका यह फायदा है कि सत्र में मान लगभग किसी भी प्रकार (जब तक कि इसकी क्रमबद्धता हो) हो सकता है।

लगभग सभी अन्य उपयोगों के लिए, आपकी (और लेख) की कमियां बहुत बड़ी हैं: सटीक प्रारूप स्थिर रखने के लिए कठिन है, वर्ग परिवर्तन आसानी से आपके अनुक्रमित डेटा को अपठनीय बना सकते हैं, गैर-जावा कोड में डेटा पढ़ना / लिखना लगभग है। असंभव (या आवश्यकता से कम से कम बहुत कठिन)।

कुछ समस्याओं को कम करते हुए JAXB और इसी तरह की प्रौद्योगिकियां समान रूप से कम लागत के साथ समान कार्य प्रदान करती हैं।


मैं JAXB को 'कम लागत' नहीं कहूंगा - स्कीमा को लिखा जाना है।
केविन क्लाइन

3
@kevincline: आपको JAXB के साथ एक स्कीमा की आवश्यकता नहीं है, यह पूरी तरह से वैकल्पिक है (और यदि आप चाहें तो इसे अपनी कक्षाओं से भी उत्पन्न कर सकते हैं)। इसके अलावा: यदि JAXB किसी भी कारण से उपयोगी नहीं है, तो बहुत सारे विकल्प हैं जैसे XML बीन्स ठीक काम करते हैं।
जोकिम सॉउर

12

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

हम वेब के माध्यम से वेब के लिए HTTP के माध्यम से जावा वस्तुओं को पारित करने के लिए क्रमांकन का भी उपयोग करते हैं। पाठ से और उसके लिए क्रमबद्ध करने की तुलना में बहुत आसान है। नुकसान यह है कि क्लाइंट और सर्वर इंस्टॉलेशन को एक साथ तैनात किया जाना चाहिए, लेकिन यह समस्या नहीं है क्योंकि हम दोनों छोरों को नियंत्रित करते हैं।


3
यह एक दिलचस्प उपयोग-मामला है! "अधिक जटिल" प्रणाली के लिए कॉल करने के लिए बहुत छोटा है और अधिकांश कमियां लागू नहीं होती हैं!
जोचिम सॉर

हमने अब पोस्ट-मॉर्टम एनालाइज़र लिखा है जो आसानी से देखने के लिए जावा ऑब्जेक्ट से एक स्प्रेडशीट बनाने के लिए पीओआई का उपयोग करता है। इसने हमें कई घंटों की लॉग फाइल परीक्षा से बचाया है।
केविन क्लाइन

7

गैर-क्रमांकन विधियों पर क्रमांकन के फायदे क्या हैं?

जावा क्रमांकन के कुछ फायदे हैं:

  • सिस्टम में निर्मित : आपको तृतीय-पक्ष उपकरण, लाइब्रेरी या कॉन्फ़िगरेशन पर निर्भर होने की आवश्यकता नहीं है।

  • कम से कम शुरुआत में समझने के लिए अपेक्षाकृत सरल

  • हर डेवलपर इसे जानता है (या चाहिए)। भले ही जावा देवता अनुमोदन करते हैं या अस्वीकार करते हैं, वे जावा वस्तुओं को क्रमबद्ध करने से परिचित होने की संभावना रखते हैं।

और, ज़ाहिर है, नुकसान हैं:

  • परिपत्र जावा मानक प्रवाह। मेमोरी आवंटित करता है, लेकिन एक कंस्ट्रक्टर को कॉल नहीं करता है, इसलिए क्षणिक फ़ील्ड को प्रारंभ नहीं किया जाता है। फ़ील्ड्स को वर्णमाला क्रम में प्रारंभ किया जाता है, न कि स्रोत आदेश।

  • अंतरिक्ष के संदर्भ में इतना कुशल नहीं है, लेकिन भयानक भी नहीं है। आप परिणाम को संक्षिप्त करना चाह सकते हैं।

  • भंगुर जब तक आप सावधानी बरतते हैं जब आपकी वस्तुएं बदलती हैं। और तब भी।

इसका उपयोग कब किया जाना चाहिए और इसे कब टाला जाना चाहिए?

जब उपयोग करें :

  • तैनाती का आकार मायने रखता है। सिस्टम में निर्मित, इसलिए 0 अतिरिक्त बाइट्स।

  • सभी कलाकार संगत संस्करणों का उपयोग करेंगे।

  • दीर्घकालिक भंडारण एक मुद्दा नहीं है।

जब से बचें :

  • उपरोक्त में से कोई भी लागू नहीं होता है।

3

सीरियललाइज़ेशन और एक ORM / डेटाबेस अलग-अलग चीजें हैं, हालांकि कुछ ओवरलैप है।

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

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

ORM का उपयोग करें जब आप उन डेटाबेस के लिए डेटा को बनाए रखना चाहते हैं जहां आप बड़ी मात्रा में डेटा के साथ काम कर रहे हैं या रिपोर्टिंग, खोज / क्वेरी, वेयरहाउसिंग या अन्य चीजों की आवश्यकता है जो डेटाबेस अच्छे हैं। जब आप डिस्क पर अपनी डेटा संरचना (यों) का प्रतिनिधित्व बचाना चाहते हैं, तो क्रमांकन का उपयोग करें।


0

सीरियलाइज़ेशन का उपयोग शायद ही कभी अभ्यास में किया जाता है।

जैसा कि पहले ही उल्लेख किया गया है कि क्रमांकन के लिए सबसे आम उपयोग मामला एक सत्र डेटाबेस में वस्तुओं को स्टोर करने के लिए है। यह दो कारणों से अच्छी तरह से काम करता है: सत्र अल्पकालिक होते हैं, और सत्र डेटाबेस कैसे संबंधित वस्तुओं के लिए मनमाना वस्तुओं को मैप करने का कोई ज्ञान नहीं है।

डेटा के लिए जिसे लंबे समय तक बनाए रखा जाना चाहिए (जैसे अमेज़ॅन शॉपिंग कार्ट) एक डेटाबेस में उस डेटा को संग्रहीत करने के लिए सबसे अच्छा अभ्यास है।

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

इस दृष्टिकोण के साथ दो समस्याएं हैं:

पहला, सत्र डेटाबेस के लिए सत्र डेटा फ्लशिंग एक धीमी प्रक्रिया है। फ्लशिंग सत्र डेटा भी अक्सर प्रदर्शन को कम कर देता है, और अधिकांश सर्वर हर 30 सेकंड, या हर मिनट, या लंबे समय तक फ्लश करने के लिए कॉन्फ़िगर किए जाते हैं। यह "प्रतीत होता है" असफल समाधान 100% प्रभावी कभी नहीं होता है।

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

क्रमबद्धता का एक अन्य उपयोग फ्लेक्स जैसी चौखटों का उपयोग करके तेजी से प्रतिक्रिया समय प्रदान करना है जो सर्वर-क्लाइंट इंटरैक्शन के लिए क्रमांकन और ऑब्जेक्ट ग्राफ़ के संपीड़न का उपयोग करते हैं।

जैसा कि अन्य ने बताया है, क्रमबद्धता को नियोजित करने के कुछ रचनात्मक और उपयोगी कारण हैं, लेकिन ये व्यवहार में दुर्लभ हैं।

ऐतिहासिक रूप से क्रमांकन सही ढंग से और विश्वसनीयता को लागू करने के लिए मुश्किल है, इसे सीमित करके इसे कम संख्या में उपयोग किया जाता है। अधिकांश डेवलपर्स कभी भी वस्तुओं को स्वयं अनुक्रमित नहीं करेंगे, लेकिन उन रूपरेखाओं पर भरोसा कर सकते हैं जो इसे पर्दे के पीछे करते हैं।


2
"व्यवहार में सीरियल का उपयोग शायद ही कभी किया जाता है।" - अक्सर REST वेब सेवाओं की दुनिया में सीरियललाइजेशन कहा जाता है। ज्यादातर समय, एक स्ट्रिंग्स और इंटेगर या इस तरह के साथ काम कर रहा है - लेकिन इसकी एक वास्तविक चीज और अधिक जटिल वस्तुओं को इसके बारे में जागरूकता की आवश्यकता है। यह कहने के लिए कि इसका उपयोग शायद ही कभी किया जाता है, जो अक्सर उपयोग करने वाले डोमेन के एक बड़े स्वाथ को अनदेखा करता है।

0

"जावा क्रमांकन का उपयोग कब करें" और "जावा क्रमांकन से बचने के लिए कब" का संक्षिप्त उत्तर

जावा क्रमांकन का उपयोग करें यदि

  • कुछ कोडिंग आवश्यक होनी चाहिए
  • यह महत्वपूर्ण नहीं है कि द्विआधारी डेटा मानव पठनीय नहीं है
  • क्रमबद्ध डेटा में खोज neccessary नहीं है (डेटाबेस जैसी क्वेरी संभव नहीं है)
  • भी
    • क्रमबद्ध डेटा संरचना परिवर्तित नहीं होती है या
    • अगर डेटा संग्रहीत करने के बाद "डेटा संरचना परिवर्तन" (किसी वेब ऐप में सत्र-डेटा) के बाद संग्रहित डेटा पढ़ने योग्य नहीं है, तो यह महत्वपूर्ण नहीं है

अन्य सभी स्थितियों में "बाइनरी जावा क्रमांकन" खराब है

वैकल्पिक

  • xml क्रमांकन
  • nosql डेटाबेस
  • ORM के साथ संबंधपरक डेटाबेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.