2010-06-16 10 views
16

जब मैं एक वस्तु को क्रमानुसार, मैं श्रेणी स्तर पर serialVersionUID तंत्र का उपयोग दो प्रकार के संगतता सुनिश्चित करने के कर सकते हैं।कैसे जावा क्रमबद्धता में enums की स्थिरता सुनिश्चित करने के लिए?

हालांकि, क्या होता है जब मैं enum मूल्यों के क्षेत्र को क्रमानुसार? क्या यह सुनिश्चित करने का एक तरीका है कि enum प्रकार serialization और deserialization के बीच छेड़छाड़ नहीं किया गया है?

मान लीजिए कि मैं OperationResult {सफलता, असफल} की तरह एक enum, और एक क्षेत्र एक वस्तु है कि धारावाहिक की जा रही में "परिणाम" कहा जाता है। मैं कैसे सुनिश्चित करूं, जब वस्तु deserialized है, तो परिणाम अभी भी सही है भले ही किसी ने दुर्भावनापूर्ण दोनों को उलट दिया? (मान लीजिए enum कहीं और एक स्थिर enum के रूप में घोषित किया जाता है)

मैं जिज्ञासा से बाहर सोच रहा हूँ - मैं जार स्तर के प्रमाणीकरण का उपयोग गड़बड़ी रोकने के लिए।

+0

सभी को धन्यवाद! – Uri

उत्तर

22

से: http://www.theserverside.com/news/thread.tss?thread_id=50190#265205

enum सुविधा के डिजाइनरों का फैसला किया कोई उपयोग के मामले रनटाइम पर नए enum वस्तुओं को बनाने के लिए है। उन्होंने को बहुत सावधानी बरतने की अनुमति नहीं दी।

इसलिए, ऐसा लगता है कि enum वस्तुओं को पूरी तरह से क्रमबद्ध और deserialised नहीं किया जा सकता है। इसके अलावा, http://java.sun.com/javase/6/docs/platform/serialization/spec/serial-arch.html#6469 से:

Enum स्थिरांक क्रमांकित हैं अलग ढंग से साधारण serializable या externalizable वस्तुओं की तुलना। लगातार एक enum की धारावाहिक रूप अपने नाम के लिए पूरी तरह से होते हैं; निरंतर के क्षेत्र मूल्यों रूप में मौजूद नहीं हैं। एक enum निरंतर क्रमानुसार करने, ObjectOutputStream enum निरंतर का नाम विधि द्वारा दिए गए मान लिखता है। deserialize करने के लिए एक enum निरंतर, ObjectInputStream धारा से निरंतर नाम पढ़ता है; deserialized निरंतर तो java.lang.Enum.valueOf विधि को फोन करके प्राप्त किया जाता है, निरंतर के enum तर्क के रूप में प्राप्त निरंतर नाम के साथ टाइप गुजर।अन्य serializable या externalizable वस्तुओं की तरह, enum स्थिरांक वापस क्रमबद्धता धारा में बाद में प्रदर्शित होने के संदर्भ के लक्ष्य के रूप में कार्य कर सकते हैं।

प्रक्रिया है जिसके द्वारा enum स्थिरांक क्रमानुसार लगे हुए हैं अनुकूलित नहीं किया जा सकता: किसी भी वर्ग-विशेष writeObject, readObject, readObjectNoData, writeReplace, और readResolve तरीकों enum प्रकार से परिभाषित किया गया क्रमबद्धता और अक्रमांकन दौरान अनदेखी कर रहे हैं। इसी प्रकार, सीरियल पर्सिस्टेंटफिल्ड्स या सीरियल वर्सेनयूआईडी फ़ील्ड घोषणाएं को भी अनदेखा किया जाता है - सभी enum प्रकारों में 0L का एक निश्चित धारावाहिक संस्करण है। के बाद से वहाँ डेटा की प्रकार भेजा में कोई भिन्नता है दस्तावेजीकरण serializable खेतों और enum प्रकार के लिए डेटा, अनावश्यक है ।

5

Enums अक्रमांकन दौरान पढ़ने के लिए बदल दिया जाता है।

एक enum उदाहरण serializing के लिए नियमों को एक "साधारण" serializable वस्तु serializing के लिए उन लोगों से अलग: संस्करण 1.5 के लिए serialization release notes का हवाला देते हुए एक enum उदाहरण के धारावाहिक रूप केवल अपने enum निरंतर होते हैं नाम, जानकारी के साथ इसके आधार enum प्रकार की पहचान। Deserialization व्यवहार अच्छी तरह से के रूप में अलग है - कक्षा की जानकारी उचित enum वर्ग खोजने लिए किया जाता है, और Enum.valueOf विधि साथ उस वर्ग और व्यवस्था enum के लिए निरंतर प्राप्त करने के लिए प्राप्त निरंतर नाम कहा जाता है वापसी।

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