2009-09-23 10 views
13

ग्रहण अच्छी तरह से मेरे लिए serialVersionUID उत्पन्न करता है। लेकिन यह निष्क्रिय कोड पीढ़ी प्रतीत होता है क्योंकि आईडी स्वचालित रूप से अपडेट नहीं की जाएगी क्योंकि जब तक मैं पीढ़ी को फिर से नहीं करता तब तक फ़ाइल को बदलता हूं।प्रत्येक परिवर्तन के साथ serialVersionUID की स्वत: पीढ़ी ग्रहण

क्या हर बार जब मैं सामग्री बदलता हूं तो serialVersionUID उत्पन्न होने का कोई तरीका है? "एक्शन एक्शन" में ऐसा विकल्प शामिल नहीं लगता है - क्या किसी को ऐसा करने का कोई तरीका मिला है?

यह अच्छा होगा कि इसे आईडीई सेव क्रियाओं या कुछ इसी तरह के साथ जोड़ा जा सके ताकि अगर मैं ऐसा कर रहा हूं तो मैं परिवर्तन को वापस कर सकता हूं जो क्रमबद्धता को प्रभावित नहीं करता है।

सादर, Touko

संपादित करें: @gustafc: इस के लिए दो मुख्य बिंदु इस प्रकार हैं:

  • मैं सही ढंग से समझ लिया है, तो विभिन्न compilers ऊपर विभिन्न मूल्यों के साथ serialVersionUID के लिए खत्म हो सकता है
    • Serializable API: हालांकि, यह दृढ़ता से अनुशंसा की जाती है कि सभी धारावाहिक वर्ग स्पष्ट रूप से serialVersionUID मानों को घोषित करते हैं, डिफ़ॉल्ट सीरियलवर्स के बाद से ionUID गणना अत्यधिक वर्ग विवरण संकलक कार्यान्वयन के आधार पर भिन्न हो सकता है कि के प्रति संवेदनशील है, और इस तरह अक्रमांकन
  • मैं सर्वर पर काम करने वस्तुओं की तरह कमांड पैटर्न की तरह उपयोग कर रहा हूँ के दौरान अप्रत्याशित InvalidClassExceptions हो सकती है। इसलिए, ऑब्जेक्ट सामग्री परिवर्तित नहीं होने के बावजूद, क्लाइंट सामग्री सर्वर और सर्वर पर अलग होने पर मामलों को पकड़ना अच्छा लगेगा।
    • लेकिन किसी अन्य समय सोचने पर, यह शायद ऑटो-जनरेटेड वैल्यू के साथ काम नहीं करेगा क्योंकि केवल सामग्री में परिवर्तन ही बदल जाएगा? तो, वास्तव में मैं एक स्वत: वृद्धि serialVersionUID

इस ध्वनि समझदार करता है करना चाहते हैं?

सुम्मा summarum, अधिक सोच के बाद, एक स्वत: वृद्धि serialVersionUID प्रत्येक परिवर्तन पर वृद्धि भी बेहतर होगा ...

+0

आप ऐसा क्यों करना चाहते हैं? यदि आप एक निर्दिष्ट नहीं करते हैं तो संकलक एक ही 'serialVersionUID' को ग्रहण के रूप में स्वतः उत्पन्न करता है। 'SerialVersionUID' निर्दिष्ट करने वाला पूरा बिंदु यह है कि जब तक आप ब्रेकिंग परिवर्तन नहीं करते हैं (वर्ग पदानुक्रम बदलें या फ़ील्ड हटाएं) तब तक * नहीं बदला जाना चाहिए। – gustafc

+0

@gustafc: संपादित करें – Touko

उत्तर

4

वहाँ ग्रहण करने में कोई मानक कार्यक्षमता यह करने के लिए है।

2

आप Ant SerialVer task के साथ बिल्ड समय पर सीरियल संस्करण अपडेट कर सकते हैं।

0

आईडी स्वचालित रूप से अपडेट नहीं की जाएगी क्योंकि जब तक मैं पीढ़ी नहीं करता तब तक फ़ाइल को तब तक बदल नहीं जाता है।

AFAIK डिफ़ॉल्ट serialVersionUID बस यह है - एक वर्ग के वर्तमान "आकार" के आधार पर उत्पन्न एक आईडी। इसलिए यदि आप कुछ भी बदलते समय अपनी आईडी जेनरेट करना चाहते हैं - बस इसे छोड़ दें।

हालांकि, अगर आप कभी-कभी serialVersionUID बदलना चाहते हैं - बस इसे बदलें। आईडी में यादृच्छिक संशोधन करेगा।

यादृच्छिक संख्या लगातार संख्याओं की तुलना में केवल थोड़ी बेहतर है (यदि आप मान सकते हैं कि कोई भी आपके पर्यावरण में एक ही योग्य नाम के साथ कक्षा नहीं बनाता है), तो आप serialVersionUID = 1 से भी शुरू कर सकते हैं और इच्छानुसार इस नंबर को बढ़ा सकते हैं।

+0

"बस इसे छोड़कर" देखें, हालांकि, कंपाइलर पर निर्भर है। यदि धारावाहिक रूप से वास्तव में उपयोग किया जा रहा है, तो अन्य जावा संस्करण/कंपाइलर उपयोग में हैं, आदि। किसी ऐसे चीज पर भरोसा करना जरूरी नहीं है जिस पर आपका नियंत्रण नहीं है। –

संबंधित मुद्दे