2010-07-09 13 views
8

Witam wszystkich, którzy pracowali z memcache, a kiedy skompilowałem ten kod, otrzymałem następujące błędy.Błąd obiektu niezdolnego do serializacji podczas pracy z 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 

udało mi się go naprawić z konwersji klasy użytkownika toString ale nie chcę użyć toString method.I tylko chcą korzystać z klasy do dodawania i dostać mwethods. Jak mogę rozwiązać ten problem? Oto kod, którego używam.

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

Przykro mi, zapomniałem o klasie użytkownika, podaję również klasę użytkownika, aby pomóc mi lepiej.

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


    } 

Odpowiedz

12

Memcache nie wie jak serializować obiekty. Będziesz musiał zaimplementować Serializable, aby Java obsługiwała serializację, lub Externalizable, jeśli potrzebujesz większej kontroli nad procesem (de) serializacji.

+0

Co muszę zaimplementować w metodzie serializowalnej? – mehmetozer

+3

Musisz zaimplementować interfejs 'Serializable':' public class User implementuje Serializable {} '. Interfejs jest tylko znacznikiem informującym o mechanizmie serializacji, w którym klasa "Użytkownik" może być serializowana. Rzeczywista serializacja odbywa się automatycznie, więc nie trzeba wdrażać żadnych metod. –

+0

Co więcej, powodem zastosowania metody toString() było przede wszystkim to, że String jest szeregowalny, tzn. Można go przekonwertować na kod bajtowy iz powrotem. –

3

Zaktualizowano ze względu na modyfikację pytania.

Twoja klasa użytkownika musi implementować Serializable. Mamy nadzieję, że jest to tak proste, jak pisaniejako Serializable nie zawiera żadnej metody.

+0

Przepraszam za missin class. Dodałem klasę User, tak jak powiedziałeś. – mehmetozer

0

Ten problem nadchodzi, ponieważ JVM nie jest w stanie serializować obiektu w sposób rażący z powodu konfliktu w schemacie. W moim przypadku identyfikator wersji seryjnej niektórych klas jest zdefiniowany jako domyślny 1L. Te klasy są nawzajem dla siebie nawzajem. Przypisałem pewną unikalną wartość niestandardową. Mój problem został rozwiązany.

Powiązane problemy