Wednesday, 15 August 2012

java - Why compiler do not set serialVersionUID automatically? -


यदि सीरियलाइज़ेबल वर्ग में कोई serialVersionUID परिभाषित नहीं है, तो एक जोखिम है कि (! वही वर्ग के लिए!) जेवीएम जो सीरियलायजेशन करते हैं, वे जेवीएम की तुलना में अलग संस्करण की गणना करेंगे, जो deserialization करते हैं। अनुशंसित समाधान सीरियलवर टूल के साथ संस्करण आईडी की गणना करता है और मैन्युअल रूप से स्रोत कोड में डालता है।

यह बेवकूफ आईएमएचओ है I यह बेहतर होगा कि javac स्वचालित रूप से धारावाहिक वीर्सयूआईआईडी की गणना करता है और स्रोत कोड में परिभाषित नहीं होने पर बाइटकोड को डाल दिया जाता है।

क्या संकलन समय में स्वचालित गणना से कोई समस्या है?

मुझे पता है कि कंपाइलर प्लगिन javac -Xplugin की तरह कुछ है। क्या यह प्लग-इन बनाना संभव है जो स्वतन्त्रकरण करता है? या शायद ऐसा प्लगइन पहले ही बनाया गया है?

कृपया मुझे गलत डुप्लिकेट न दें। मामले पर चर्चा की जाती है जब सीरियललाइज़ेशन के लिए कक्षाओं के विभिन्न संस्करण संगत हैं। मैं दिलचस्प हूँ एक केस जब एक ही कक्षा से हमेशा सीरियलाइजेशन की अपेक्षा होती है और वर्ग के अलग-अलग संस्करणों को असफल होना चाहिए।

यदि सीरियलिज़ेबल क्लास में कोई सीरियल वीरियोनयूआईडी परिभाषित नहीं है, तो एक जोखिम होता है (!! उसी क्लास के लिए!) जेवीएम जो सीरियलाइजेशन करते हैं, वे जेवीएम की तुलना में अलग संस्करण की गणना करेंगे जो deserialization करते हैं।

< पी> एपीएआईके ने निर्दिष्ट किया है कि कैसे डिफ़ॉल्ट सीरियल वर्जन यूआईडी की गणना की जानी चाहिए और हर संगत JVM को यह सही ढंग से लागू करना चाहिए:

आप लिंक किए गए डॉक्टर में एक वाक्य है: नोट - यह अनुशंसा की जाती है कि सभी सीरिजलाइज करने योग्य वर्ग स्पष्ट रूप से घोषित करें SerialVersionUID मान, क्योंकि डिफ़ॉल्ट सीरियलवर्सियोनयूआईडी गणना क्लास विवरण के प्रति अत्यधिक संवेदनशील है, जो कि संकलक कार्यान्वयन के आधार पर अलग-अलग हो सकती है, और इस तरह deserialization के दौरान अप्रत्याशित सीरियलVersionUID विरोधाभास में परिणाम हो सकता है, जिसके कारण deserialization को विफल हो सकता है। इसलिए यदि 'हर अनुवर्ती जेवीएम को यह सही ढंग से लागू करना चाहिए' तो अनपेक्षित सीरियल वर्जन यूआईडी टकराव नहीं होगा। लेकिन

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

यह इस संबंध में कुछ भी नहीं बदलेगा यदि कम्पाइलर डिफ़ॉल्ट सीरियल वर्जन यूआईडी को क्लास फ़ाइल में जोड़ देगा।


No comments:

Post a Comment