2010-07-09 7 views
8

Hallo allerseits, ich habe mit Memcache gearbeitet, und als ich diesen Code kompiliert habe, habe ich folgende Fehler bekommen.Nicht-serialisierbarer Objektfehler während der Bearbeitung von 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 

ich es geschafft, es zu beheben mit User-Klasse toString konvertieren wollen aber ich nicht toString method.I wollen einfach nur meine Klasse verwenden, um hinzufügen und mwethods verwenden. Wie kann ich dieses Problem beheben? Hier ist der Code, den ich verwende.

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(); 
    } 
} 
} 

Sorry, ich vergaß die Benutzerklasse, ich gebe Ihnen auch die User-Klasse mich besser zu helfen.

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(); 
    } 


    } 

Antwort

12

Memcache weiß nicht, wie Sie Ihre Objekte serialisieren. Sie müssen Serializable implementieren, damit Java die Serialisierung behandelt, oder Externalizable, wenn Sie mehr Kontrolle über den (De-) Serialisierungsprozess benötigen.

+0

Was muss ich in der serialisierbaren Methode genau implementieren? – mehmetozer

+3

Sie müssen die 'Serializable' Schnittstelle implementieren:' public class Benutzer implementiert Serializable {} '. Die Schnittstelle ist nur eine Markierung, die dem Serialisierungsmechanismus sagt, dass die Klasse 'Benutzer' serialisiert werden kann. Die eigentliche Serialisierung erfolgt automatisch, Sie müssen also keine Methoden implementieren. –

+0

Der Grund für die Anwendung von toString() ist in erster Linie, dass String Serializable ist, d. H. Es kann in Bytecode und wieder zurück konvertiert werden. –

3

Aktualisiert wegen Frage Änderung.

Ihre Benutzerklasse muss also Serializable implementieren. Hoffentlich ist das so einfach wie das Schreiben

als Serializable enthält keine Methode.

+0

Sorry für Missin-Klasse. Ich habe die Benutzerklasse hinzugefügt, wie Sie gesagt haben. – mehmetozer

0

Dieses Problem tritt auf, weil JVM aufgrund eines Konflikts im Schema nicht in der Lage ist, serialisierte Objekte korrekt zu serialisieren. In meinem Fall ist die Serienversions-ID einiger Klassen standardmäßig auf 1L festgelegt. Diese Klassen sind füreinander korporativ. Ich habe einen eindeutigen benutzerdefinierten Wert zugewiesen. Mein Problem wurde gelöst.