2010-03-06 22 views
26

मेरे समस्या जब यह वस्तु दूसरी बार पढ़ने का प्रयास यह अपवाद फेंकता है,:StreamCorruptedException: अमान्य प्रकार कोड: एसी

java.io.StreamCorruptedException: invalid type code: AC 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) 
    at Client.run(BaseStaInstance.java:313) 

java.io.StreamCorruptedException: invalid type code: AC 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) 
    at Client.run(BaseStaInstance.java:313) 

पहली बार मैं ठीक उसी वस्तु संदेश भेजने; हालांकि, जब मैं दूसरी बार एक ही चीज़ करने की कोशिश करता हूं, तो यह उपरोक्त त्रुटि को फेंकता है। क्या मुझे readObject() विधि को फिर से intialize करने की आवश्यकता है? मैंने नीचे दी गई रेखा से प्राप्त होने वाली संदेश ऑब्जेक्ट को भी मुद्रित किया है और यह ठीक उसी उदाहरण के समान है जहां यह ठीक काम करता है।

Object buf = myInput.readObject(); 

मुझे लगता है कि इसमें शामिल होने में कुछ समस्या है, लेकिन मुझे वास्तव में जोड़ने के लिए कोई उपयोग नहीं है। मैं बस हर बार एक ताजा रेखा पढ़ना चाहता हूँ। मैं वास्तव में इस बग को ठीक करने में कुछ मदद की सराहना करता हूं। धन्यवाद।

==================================

है कि एक लाइन से पहले, मैं कर रहा हूँ रन() विधि में सॉकेट के लिए केवल इनपुट और आउटपुट ऑब्जेक्ट्स बनाना। वस्तु घोषणा कक्षा में रन() विधि के बाहर है: -

@Override 
public void run() { 
    try { 
     sleep((int) 1 * 8000); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    try { 
     //Creating input and output streams to transfer messages to the server 
     myOutput = new ObjectOutputStream(skt.getOutputStream()); 
     myInput = new ObjectInputStream(skt.getInputStream()); 
     while (true) { 
      buf = myInput.readObject(); 
     } 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

आप सही हैं; मैं वस्तु को बंद नहीं करता हूं। मुझे यकीन नहीं है कि यह कैसे करें।

+0

मुझे यकीन है कि जहां किसी चीज़ –

+0

एनबी आप EOFException पकड़ने चाहिए और यह इलाज बंद नहीं करने के लिए नहीं कर रहा हूँ वीएम तर्क नीचे जोड़कर हल एक त्रुटि के रूप में: स्टैक ट्रेस लॉग या मुद्रित न करें; बस इसे रीडिंग लूप को समाप्त करने दें। मुझे नहीं पता कि आप अज्ञातहोस्टएक्सप्शन को क्यों पकड़ रहे हैं, जहां आप हैं: इसे संबंधित प्रयास ब्लॉक के भीतर से नहीं फेंक दिया जा सकता है। नींद() सचमुच समय की बर्बादी है। इसे हटा दो। – EJP

उत्तर

54

मूल समस्या यह है कि यदि आप किसी मौजूदा ObjectInputStream कि आप पहले से ही एक पूर्व ObjectOutputStream का इस्तेमाल किया है करने के लिए लिखने के लिए लिखने के लिए एक नया ObjectOutputStream का उपयोग कर रहे है। इन धाराओं में शीर्षलेख होते हैं जो संबंधित रचनाकारों द्वारा लिखे और पढ़े जाते हैं, इसलिए यदि आप एक और ObjectOutputStream बनाते हैं तो आप एक नया हेडर लिखेंगे, जो शुरू होता है - अनुमान लगाओ क्या? - 0xAC, और मौजूदा ObjectInputStream इस बिंदु पर एक और शीर्षलेख की उम्मीद नहीं कर रहा है, इसलिए यह बारफ़्स है।

जावा फ़ोरम थ्रेड में @trashgod द्वारा उद्धृत, मुझे 'दोनों सिरों पर प्रत्येक ऑब्जेक्ट के लिए नया' के बारे में हिस्सा छोड़ देना चाहिए था: यह बस अपमानजनक है। सॉकेट के जीवन के लिए एक ओओएस और ओआईएस का प्रयोग करें, और सॉकेट पर किसी भी अन्य धाराओं का उपयोग न करें।

आप भूल जाते हैं कि तुम क्या लिखा है चाहते हैं, ObjectOutputStream.reset().

का उपयोग और किसी अन्य धाराओं या Readers या Writers एक ही सॉकेट पर प्रयोग नहीं करते। ऑब्जेक्ट स्ट्रीम एपीआई सभी जावा आदिम डेटाटाइप और सभी Serializable कक्षाओं को संभाल सकता है।

+1

+1 @ ड्रूकी: यह सही उत्तर है, और मूल स्रोत से! :-) – trashgod

+0

@EJP evrytime मैं कोड को एक नया ओओएस चलाता हूं और ओआईएस बनाया जाता है। मैं इसे कैसे प्रबंधित करूं? –

+0

@ अखिलकनंबियार मुझे नहीं पता कि तुम मुझसे क्या पूछ रहे हो जो पहले से ही उत्तर नहीं दिया गया है। – EJP

-1

जावा 7/8 का उपयोग करते समय एक समान अपवाद मद्देनजर मैं इसे

-Dsun.lang.ClassLoader.allowArraySyntax=true 
+0

'समान' समान नहीं है। यह ओपी द्वारा पोस्ट की गई समस्या का समाधान नहीं करता है। – EJP

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