डिसेरिएलाइज़ेशन की समस्या का कारण क्या है?
आपके प्रश्न का उत्तर देने से पहले मैं आपको कुछ पृष्ठभूमि देना चाहूंगा,
सीरियलाइज़ेशन रनटाइम प्रत्येक सीरियल करने योग्य वर्ग के साथ एक संस्करण संख्या को जोड़ता है, जिसे एक सीरियलवर्सनयूआईडी कहा जाता है, जिसका उपयोग डिसेरिएलाइज़ेशन के दौरान यह सत्यापित करने के लिए किया जाता है कि एक सीरियलाइज्ड ऑब्जेक्ट के प्रेषक और रिसीवर ने उस ऑब्जेक्ट के लिए लोड किए गए वर्ग हैं जो सीरियलाइज़ेशन के संबंध में संगत हैं। यदि रिसीवर ने उस ऑब्जेक्ट के लिए एक वर्ग लोड किया है जिसमें संबंधित प्रेषक के वर्ग की तुलना में एक अलग serialVersionUID है, तो अक्रमांकन के परिणामस्वरूप एक अमान्य क्लास अपवाद होगा।
यदि कोई क्रमबद्ध वर्ग स्पष्ट रूप से एक serialVersionUID घोषित नहीं करता है, तो क्रमांकन रनटाइम वर्ग के विभिन्न पहलुओं के आधार पर उस वर्ग के लिए एक डिफ़ॉल्ट serialVersionUID मान की गणना करेगा, यह SerialVersionUID की गणना करने के लिए कक्षा की निम्नलिखित जानकारी का उपयोग करता है,
- कक्षा का नाम।
- कक्षा संशोधक 32-बिट पूर्णांक के रूप में लिखा गया है।
- नाम के अनुसार क्रमबद्ध प्रत्येक इंटरफ़ेस का नाम।
- क्षेत्र के नाम के आधार पर छांटे गए वर्ग के प्रत्येक क्षेत्र के लिए (निजी स्थिर और निजी क्षणिक क्षेत्रों को छोड़कर:
- फ़ील्ड का नाम.
- फ़ील्ड के संशोधक 32-बिट पूर्णांक के रूप में लिखे गए हैं।
- क्षेत्र का वर्णनकर्ता।
-
यदि कोई वर्ग प्रारंभकर्ता मौजूद है, तो निम्न लिखें:
विधि का नाम, .
विधि का संशोधक, java.lang.reflect.Modifier.STATIC, 32-बिट पूर्णांक के रूप में लिखा गया है।
विधि का वर्णनकर्ता, () वी।
-
विधि नाम और हस्ताक्षर के आधार पर छांटे गए प्रत्येक गैर-निजी कंस्ट्रक्टर के लिए:
विधि का नाम, .
विधि के संशोधक 32-बिट पूर्णांक के रूप में लिखे गए हैं।
विधि का वर्णनकर्ता।
-
विधि नाम और हस्ताक्षर द्वारा क्रमबद्ध प्रत्येक गैर-निजी विधि के लिए:
विधि का नाम।
विधि के संशोधक 32-बिट पूर्णांक के रूप में लिखे गए हैं।
विधि का वर्णनकर्ता।
तो, आपके प्रश्न का उत्तर देने के लिए,
क्या किसी सार्वजनिक/निजी संपत्ति को हटाने से समस्या हो सकती है? नई संपत्तियां जोड़ना, शायद? क्या कक्षा में एक नया कार्य जोड़ने से समस्याएँ पैदा होंगी? और कंस्ट्रक्टर्स के बारे में क्या?
हां, डिफ़ॉल्ट रूप से ये सभी जोड़/निकालने से समस्या पैदा होगी।
लेकिन इसे दूर करने का एक तरीका स्पष्ट रूप से SerialVersionUID को परिभाषित करना है, यह क्रमांकन प्रणाली को बताएगा कि मुझे पता है कि कक्षा समय के साथ विकसित (या विकसित) होगी और कोई त्रुटि नहीं होगी। तो डी-सीरियलाइजेशन सिस्टम केवल उन क्षेत्रों को पढ़ता है जो दोनों तरफ मौजूद हैं और मान निर्दिष्ट करते हैं। डी-क्रमबद्धता पक्ष पर नए जोड़े गए फ़ील्ड को डिफ़ॉल्ट मान प्राप्त होंगे। यदि डी-सीरियलाइज़ेशन पक्ष पर कुछ फ़ील्ड हटा दिए जाते हैं, तो एल्गोरिथम बस पढ़ता है और छोड़ देता है।
SerialVersionUID घोषित करने का तरीका निम्नलिखित है,
private static final long serialVersionUID = 3487495895819393L;