2012-08-25 52 views
14

मैं किसी ऑब्जेक्ट को क्रमबद्ध करने की कोशिश कर रहा हूं और फिर क्लाइंट प्रोग्राम में अपना डेटा भेजने के बाद इसे deserialize।जावा - Deserialization InvalidClassException (कोई वैध कन्स्ट्रक्टर नहीं)

यहां एक उदाहरण है कि ऑब्जेक्ट की विरासत कैसे काम करती है। जिस वस्तु को मैं धारावाहिक और deserializing कर रहा हूँ वह व्यक्ति है।

के रहने -> पशु -> एनपीसी -> व्यक्ति -> बच्चों की

रहते हैं, पशु, और एनपीसी Serializable को लागू नहीं करते। मैं उन तीन वर्गों को नहीं बदल सकता। व्यक्ति और बच्चा Serializable लागू करते हैं। व्यक्ति और लिविंग भी अमूर्त वर्ग हैं। मैं एक व्यक्ति (जो एक बच्चा है) को क्रमबद्ध कर सकता है और इसे भेज सकता है, लेकिन जब मैं किसी व्यक्ति (जो एक बच्चा है) को बेकार करने का प्रयास करता है, तो मुझे बच्चे पर एक अवैध क्लास अपवाद मिलता है, "कोई वैध निर्माता नहीं" कहता है।

ऐसा क्यों हो रहा है? जीवित, पशु, और एनपीसी सभी को Serializable लागू करना चाहिए?

+3

शायद प्रासंगिक: http://stackoverflow.com/questions/8632148/java-object-serialization-and-inheritance – leonbloy

उत्तर

13

अच्छा स्पष्टीकरण सवाल निम्नलिखित के लिए उत्तर में किया जाता है Deserializing an ArrayList. no valid constructor

लंबी कहानी छोटी - आप अपने मामले में अपने वर्ग, NPC के पहले nonserializable सुपर वर्ग के लिए कोई आर्ग निर्माता की जरूरत है।

आप एनपीसी के लिए किसी पहुंच नहीं है, तो और यह कोई आर्ग निर्माता शामिल नहीं है - तो आप पदानुक्रम जो सही एक का चयन करेंगे के लिए एक और 'झूठे' वर्ग जोड़ सकते हैं। जैसे

class SomeClass extends NPC { 
// will be called during deserialization 
public SomeClass(){ 
// call custom constructor of NPC 
super(null); 
} 
} 

class Person extends SomeClass implements Serializable { 
// .. 
} 
+0

उसने ऐसा किया! धन्यवाद। – WildBamaBoy

2

प्रति this thread, वे Serializable को लागू करने की जरूरत नहीं है, लेकिन वे (या कम से कम एनपीसी में पदानुक्रम में अपना पहला गैर serializable वर्ग क्योंकि) 0-पैरामीटर निर्माता शामिल होना चाहिए। यदि कक्षाओं में कोई रचनाकार परिभाषित नहीं किया गया है, तो अंतर्निहित कन्स्ट्रक्टर अपर्याप्त है, लेकिन यदि आपके पास उन वर्गों में परिभाषित अन्य रचनाकार हैं, तो आपको एक स्पष्ट 0-पैरामीटर कन्स्ट्रक्टर लिखना होगा।

चूंकि आप एनपीसी को नियंत्रित नहीं कर सकते हैं, इसके बच्चे को बनाने का प्रयास करें जो एक स्पष्ट 0-पैरा कन्स्ट्रक्टर को परिभाषित करता है लेकिन यह Serializable को लागू नहीं करता है, और देखें कि यह ऐसा नहीं करता है।

0

मुझे Hazelcast के क्रमबद्धता के साथ एक ही समस्या का सामना करना पड़ा, लेकिन इसे कस्टम क्रमिकरण का उपयोग करके मध्यस्थ वर्ग का उपयोग किए बिना हल किया गया। मैं पशु वर्ग के लिए एक खाली कोई आर्ग निर्माता के रूप में निम्नानुसार जोड़ा गया है और व्यक्ति वर्ग कार्यान्वित:

class Person extends Animal implements Serializable { 

    private void writeObject(ObjectOutputStream o) throws IOException { 
     o.writeObject(this.fieldA); 
     o.writeObject(this.fieldB); 
     o.writeObject(this.fieldC); 
     ... 
    } 

    private void readObject(ObjectInputStream o) throws IOException, ClassNotFoundException { 
     this.fieldA = (TypeOfA) o.readObject(); 
     this.fieldB = (TypeOfB) o.readObject(); 
     this.fieldC = (TypeOfC) o.readObject(); 
     ... 
    } 
} 
संबंधित मुद्दे