जावा भाषा को इसमें enums जोड़ने से बहुत फायदा हुआ; लेकिन दुर्भाग्य से वे अलग-अलग कोड स्तर वाले सिस्टम के बीच धारावाहिक वस्तुओं को भेजते समय अच्छी तरह से काम नहीं करते हैं।क्या जावा में सीरियलाइजिंग एनम्स के लिए अच्छे विकल्प हैं?
उदाहरण: मान लें कि आपके पास दो सिस्टम ए और बी हैं। वे दोनों एक ही कोड स्तर के साथ शुरू होते हैं, लेकिन किसी बिंदु पर समय पर विभिन्न बिंदुओं पर कोड अपडेट देखना शुरू होता है। अब मान लें कि कुछ
public enum Whatever { FIRST; }
और ऐसी अन्य वस्तुएं हैं जो उस enum के स्थिरांक के संदर्भ रखती हैं। उन वस्तुओं को क्रमबद्ध किया जाता है और ए से बी या इसके विपरीत भेजा जाता है। अब विचार करना बी जो भी के एक नए संस्करण
public enum Whatever { FIRST; SECOND }
तब है:
class SomethingElse implements Serializable { ...
private final Whatever theWhatever;
SomethingElse(Whatever theWhatever) {
this.theWhatever = theWhatever; ..
instantiated हो जाता है ...
SomethingElse somethin = new SomethingElse(Whatever.SECOND)
और फिर धारावाहिक और अधिक के रूप में उदाहरण के लिए (ए के लिए भेजा कुछ आरएमआई कॉल का नतीजा)। जो बुरा है, क्योंकि अब ए पर deserialization के दौरान एक त्रुटि होगी: ए जानता है कि जो भी enum वर्ग है, लेकिन एक संस्करण में जो SECOND नहीं है।
हमने इसे कठिन तरीका बताया; और अब मैं उन परिस्थितियों के लिए enums का उपयोग करने के लिए बहुत उत्सुक हूं जो वास्तव में "enums के लिए एकदम सही" होगा; सिर्फ इसलिए कि मुझे पता है कि मैं आसानी से मौजूदा एनम को विस्तारित नहीं कर सकता।
अब मैं सोच रहा हूं: क्या इस तरह की संगतता समस्याओं से बचने के लिए वहां (अच्छी) रणनीतियां हैं? या मुझे वास्तव में "प्री-एनम" समय पर वापस जाना है; और enums का उपयोग नहीं करते हैं, लेकिन एक समाधान पर भरोसा करना है जहां मैं जगह पर सादा तार का उपयोग करें?
अद्यतन: कृपया ध्यान दें कि serialversionuid का उपयोग करके यहां सहायता नहीं करता है। यह बात केवल आपको एक असंगत परिवर्तन "अधिक स्पष्ट" बनाने में मदद करती है। लेकिन मुद्दा यह है: मुझे परवाह नहीं है कि क्यों deserialization विफल रहता है - क्योंकि मुझे ऐसा होने से बचना है। और मैं अपनी वस्तुओं को क्रमबद्ध करने के तरीके को बदलने की स्थिति में भी नहीं हूं। हम आरएमआई कर रहे हैं; और हम बाइनरी के लिए क्रमबद्ध कर रहे हैं; मेरे पास इसे बदलने का कोई मतलब नहीं है।
क्या यह किसी भी वर्ग के साथ कोई मुद्दा नहीं होगा? यदि आप फ़ील्ड को किसी नए संस्करण में बदलते हैं, तो पुराने संस्करण के लिए deserialization विफल हो जाएगा। – 4castle
जरूरी नहीं है। फ़ील्ड जोड़ना एक पूरी तरह से वैध ऑपरेशन है। और यदि आप सादे तारों के साथ काम करते हैं तो आप स्पष्ट रूप से संकलन समय की जांच ढीला करते हैं; लेकिन यदि कोई ऑब्जेक्ट फ़ील्ड स्ट्रिंग है, तो वह फ़ील्ड बिना किसी समस्या के ** ** ** किसी भी मूल्य को ले जा सकता है। – GhostCat
आप स्थिरांक का उपयोग कर सकते हैं- ये अच्छी तरह से क्रमबद्ध हैं, और उनके पास कई enum-like गुण हैं –