2010-07-09 17 views
8

पर काम करते समय गैर-क्रमिक ऑब्जेक्ट त्रुटि हाय सब मैं memcache के साथ काम कर रहा था, और जब मैंने इस कोड को संकलित किया तो मुझे निम्नलिखित त्रुटियां मिलीं।Memcache

2010-07-09 10:35:53.499 INFO net.spy.memcached.MemcachedConnection: Added {QA sa=localhost/127.0.0.1:11211, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0} to connect queue 
2010-07-09 10:35:53.520 INFO net.spy.memcached.MemcachedConnection: Connection state changed for [email protected] 
Exception in thread "main" java.lang.IllegalArgumentException: Non-serializable object 
at net.spy.memcached.transcoders.BaseSerializingTranscoder.serialize(BaseSerializingTranscoder.java:86) 
at net.spy.memcached.transcoders.SerializingTranscoder.encode(SerializingTranscoder.java:135) 
at net.spy.memcached.MemcachedClient.asyncStore(MemcachedClient.java:301) 
at net.spy.memcached.MemcachedClient.set(MemcachedClient.java:691) 
at def.Tweet.main(Tweet.java:23) 
Caused by: java.io.NotSerializableException: def.User 
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1173) 
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:343) 
at net.spy.memcached.transcoders.BaseSerializingTranscoder.serialize(BaseSerializingTranscoder.java:81) 
... 4 more 

मैं उपयोगकर्ता वर्ग toString परिवर्तित करने के साथ इसे ठीक करने के लिए, लेकिन मुझे नहीं toString method.I उपयोग करने के लिए बस जोड़ सकते हैं और mwethods पाने के लिए मेरी कक्षा का उपयोग करना चाहते चाहते कामयाब रहे। मैं इस समस्या को कैसे ठीक करुं? यहां कोड है जिसका मैं उपयोग कर रहा हूं।

package def; 

import java.io.IOException; 
import java.io.Serializable; 
import java.net.InetSocketAddress; 

import net.spy.memcached.MemcachedClient; 

public class Tweet { 
    private static User user; 
    private static Message message; 
    private static Followers follower; 

public static void main(String[] args) throws Exception { 
try{ 
    user = new User(1,"Mehmet Özer","asd","127.0.0.1","True","Onine"); 
    //String deneme = user.toString(); 
    MemcachedClient c=new MemcachedClient(new InetSocketAddress("localhost", 11211)); 


    // Store a value (async) for one hour 

    c.set(user.userKey, 3600, user); 
    System.out.println(c.get(user.userKey)); 

    } 
    catch(IOException ex) { 
     ex.printStackTrace(); 
    } 
} 
} 

क्षमा करें, मैं उपयोगकर्ता वर्ग भूल गया, मैं भी तुम मुझे बेहतर मदद करने के लिए उपयोगकर्ता वर्ग दे रहा हूँ।

public class User { 
    public static String userKey = "UserDB"; 
    public static int userID ; 
    public static String userName; 
    public static String password; 
    public static String ipAddress; 
    public static String isOnline; 
    public static String lastActive; 

    public User(int userID, String userName, String password, String ipAddress,String isOnline,String lastActive) 
    { 
     this.userID = userID; 
     this.userName = userName; 
     this.password = password; 
     this.ipAddress = ipAddress; 
     this.isOnline = isOnline; 
     this.lastActive = lastActive; 

    } 
    @Override 
    public String toString() { 
     System.out.println(this.userID); 
     System.out.println(this.userName); 
     System.out.println(this.password); 
     System.out.println(this.ipAddress); 
     System.out.println(this.isOnline); 
     System.out.println(this.lastActive); 

     return super.toString(); 
    } 


    } 

उत्तर

12

मेमकैच नहीं जानता कि आपकी ऑब्जेक्ट्स को क्रमबद्ध कैसे करें। जावा को क्रमबद्ध करने के लिए Serializable को लागू करने की आवश्यकता होगी, या Externalizable यदि आपको (डी) क्रमबद्ध प्रक्रिया पर अधिक नियंत्रण की आवश्यकता है।

+0

मुझे धारावाहिक विधि में वास्तव में क्या लागू करना है? – mehmetozer

+3

आपको 'सीरियलज़ेबल' इंटरफ़ेस को लागू करने की आवश्यकता है: 'पब्लिक क्लास उपयोगकर्ता Serializable {} 'लागू करता है। इंटरफ़ेस सिर्फ एक मार्कर है जो धारावाहिक तंत्र को बताता है कि 'उपयोगकर्ता' वर्ग को क्रमबद्ध किया जा सकता है। वास्तविक क्रमिकरण स्वचालित रूप से किया जाता है, इसलिए आपको किसी भी तरीके को लागू करने की आवश्यकता नहीं है। –

+0

इसके अलावा, पहले स्ट्रिंग() को लागू करने का कारण यह है कि स्ट्रिंग सीरियलज़ेबल है, यानी इसे बाइटकोड में परिवर्तित किया जा सकता है और फिर से वापस किया जा सकता है। –

3

प्रश्न संशोधन के कारण अपडेट किया गया।

तो, आपकी उपयोगकर्ता कक्षा को Serializable लागू करना होगा। उम्मीद है कि यह

public class User implements Serializable { 
... 
} 

लिखने जैसा सरल है क्योंकि Serializable में कोई विधि नहीं है।

+0

मिसिन क्लास के लिए खेद है। मैंने यूजर क्लास को जोड़ा जैसा आपने कहा था। – mehmetozer

0

यह समस्या आ रही है क्योंकि, जेवीएम स्कीमा में संघर्ष की वजह से ऑब्जेक्ट को क्रमबद्ध करने में सक्षम नहीं है। मेरे मामले में, कुछ वर्गों की सीरियल संस्करण आईडी को डिफ़ॉल्ट रूप से 1L परिभाषित किया जाता है। ये वर्ग एक दूसरे के लिए कॉर्पोरेट हैं। मैंने कुछ अद्वितीय कस्टम मूल्य असाइन किया। मेरी समस्या हल हो गई।

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