मैंने अभी तक यह कोशिश नहीं की है, लेकिन यह जोखिम भरा लगता है। जिस मामले में मैं सोच रहा हूं वह जीबीएक्स के साथ सरल वीओ कक्षाओं का साधन है। इन वीओ को एएमएफ और संभवतः अन्य योजनाओं पर क्रमबद्ध किया जा रहा है। क्या कोई मेरे संदेहों की पुष्टि या इनकार कर सकता है कि बाइटकोड एन्हांसमेंट जैसी पिछली सामग्री को सामान्य रूप से गड़बड़ कर सकती है, और कुछ पृष्ठभूमि जानकारी क्यों प्रदान की जाती है? इसके अलावा, मुझे जीबीएक्स के विशिष्ट मामले में रूचि है।क्या कक्षाओं पर बाइटकोड एन्हांसमेंट तकनीक का उपयोग करना सुरक्षित है जो धारावाहिक हो सकता है और क्यों?
उत्तर
दृश्यों के पीछे, क्रमबद्धता प्रतिबिंब का उपयोग करती है। आपका बाइटकोड मैनिपुलेशन संभावित रूप से फ़ील्ड जोड़ रहा है। इसलिए, जब तक आप इन क्षेत्रों को क्षणिक के रूप में चिह्नित नहीं करते हैं, तो उन्हें सामान्य फ़ील्ड की तरह क्रमबद्ध किया जाएगा।
तो, आप दोनों पक्षों पर एक ही बाईटकोड हेरफेर प्रदर्शन किया है प्रदान की है, आप ठीक हो जाओगे।
आप आप को समझने के लिए पश्च संगतता काम सुविधाओं क्रमबद्धता प्रलेखन पढ़ने के लिए की आवश्यकता होगी नहीं किया है। अनिवार्य रूप से, मैं सोचता हूं आप उन क्षेत्रों को भेज सकते हैं जिन्हें रिसीवर द्वारा अपेक्षित नहीं है और आप ठीक हैं; और आप फ़ील्ड को याद कर सकते हैं और उन्हें प्राप्त करने वाले अंत में उनके डिफ़ॉल्ट मान मिलेंगे। लेकिन आपको इसे स्पेक में देखना चाहिए!
यदि आप केवल विधियां जोड़ रहे हैं, तो उनके पास क्रमिकरण पर कोई प्रभाव नहीं पड़ता है, जब तक कि वे readResolve()
आदि जैसी चीजें न हों, जिन्हें विशेष रूप से क्रमबद्धरण तंत्र द्वारा उपयोग किया जाता है।
बदलते/एक वर्ग के लिए सार्वजनिक या संरक्षित क्षेत्रों या तरीकों को हटाने यह deserialized जा करने की क्षमता है को प्रभावित करेगा जोड़ना /। इंटरफेस जोड़ने के रूप में। इन्हें अन्य चीजों के साथ serialVersionUID उत्पन्न करने के लिए उपयोग किया जाता है जो धारावाहिक प्रक्रिया के हिस्से के रूप में स्ट्रीम में लिखा जाता है। यदि वर्ग के serialVersionUID
deserialization के दौरान लोड कक्षा से मेल नहीं खाता है, तो यह असफल हो जाएगा।
आप स्पष्ट रूप से अपने वर्ग परिभाषा serialVersionUID
सेट करते हैं तो आप इस से प्राप्त कर सकते हैं। आप readObject
और writeObject
को भी लागू करना चाहते हैं।
चरम मामले में आप Externalizable को लागू करने और वस्तु के सभी क्रमबद्धता का पूरा नियंत्रण हो सकता है।
निरपेक्ष सबसे खराब स्थिति परिदृश्य (हालांकि कुछ स्थितियों में अविश्वसनीय रूप से उपयोगी) एक जटिल वस्तु पर writeReplace
को क्रमबद्ध करने के लिए इसे क्रमबद्ध करने के लिए एक सरल वस्तु ऑब्जेक्ट को स्वैप करने के लिए है। फिर deserialization में सरल मूल्य वस्तु दूसरी तरफ जटिल वस्तु का पुनर्निर्माण या पता लगाने के लिए readResolve
लागू कर सकते हैं। जब आप इसे खींचने की ज़रूरत होती है तो यह दुर्लभ होता है, लेकिन जब आप करते हैं तो बहुत मजेदार होता है।
+1। मैं उसके बारे में भूल गया। यदि आप रनटाइम पर इसकी गणना नहीं करते हैं, जो संभावित रूप से ऑब्जेक्ट्स को स्थानांतरित करने की क्षमता को प्रभावित करेगा। – dty
+1 दोनों पक्षों को बढ़ाने के लिए KISS दृष्टिकोण को इंगित करने के लिए +1। निश्चित रूप से मैं पहले क्या कोशिश करता हूँ। 'SerialVersionUID' के लिए –