2010-05-26 16 views
7

फेंकता है मैं जावा लेने की कोशिश कर रहा हूं और क्लाइंट को सर्वर पर एक आत्म परिभाषित वर्ग (संदेश) की एक साधारण वस्तु भेजने के लिए जावा के क्लाइंट/सर्वर के साथ परीक्षण करना चाहता था। समस्या यह थी कि मैं सर्वर पक्ष पर ClassNotFoundException प्राप्त कर रहा था।readobject विधि ClassNotFoundException

मुझे लगता है कि शेष कोड ठीक दिखते हैं क्योंकि स्ट्रिंग जैसी अन्य वस्तुएं बिना किसी समस्या के जा सकती हैं।

मेरे पास प्रत्येक ग्राहक और सर्वर के लिए अलग-अलग स्थानों में दो अलग-अलग नेटबीन परियोजनाएं थीं।

उनमें से प्रत्येक के पास अपने संबंधित पैकेज के तहत संदेश वर्ग की अपनी प्रति है। संदेश वर्ग Serializable लागू करता है।

ग्राहक पक्ष पर, मैं एक संदेश वस्तु को भेजने का प्रयास करता हूं।

सर्वर पक्ष पर, readObject विधि को कॉल करने पर, ऐसा लगता है कि क्लाइंट के पैकेज से संदेश वर्ग को स्वयं के बजाय मिल रहा है। printStackTrace ने दिखाया: "java.lang.ClassNotFoundException: client.Message" सर्वर की तरफ

मैंने अभी तक प्राप्त ऑब्जेक्ट को कास्ट या स्टोर करने का प्रयास नहीं किया है। क्या मैंने कुछ छोड़ दिया है?

उत्तर

16

पैकेज नाम और वर्गनाम बिल्कुल दोनों तरफ समान होना चाहिए। अर्थात। एक बार लिखें, एक बार संकलित करें और फिर दोनों पक्षों को समान प्रतिलिपि दें। अलग server.Message और client.Message कक्षाएं नहीं हैं, लेकिन एक shared.Message कक्षा या ऐसा कुछ भी नहीं है।

आप एक ही पैकेज/वर्ग के नाम गारंटी ले सकते हैं, लेकिन हमेशा नहीं जब भी यह बिल्कुल एक ही प्रति है, तो आप वर्ग (ते) प्रश्न में करने के लिए एक ही मूल्य के साथ एक serialVersionUID क्षेत्र को जोड़ने के लिए की जरूरत है।

package shared; 

import java.io.Serializable; 

public class Message implements Serializable { 
    private static final long serialVersionUID = 1L; 

    // ... 
} 
+2

और serialUID बिल्कुल 1L नहीं बनाते हैं तो कृपया, क्योंकि यह अन्य बेवकूफ डेवलपर होने के साथ हस्तक्षेप कर सकता है एक ही विचार – Daniel

+0

यह अब काम करता है! धन्यवाद ~ !! आखिरकार मैं समझता हूं कि – eruina

+0

पर क्या चल रहा है आपका स्वागत है। – BalusC

4

कारण है, कि ObjectInputStream में readObject() व्यावहारिक रूप के रूप में कार्यान्वित किया जाता है:

String s = readClassName(); 
Class c = Class.forName(s); // Here your code breaks 
Object o = c.newInstance(); 
...populate o... 
संबंधित मुद्दे