简体   繁体   English

处理Memcache时出现非序列化对象错误

[英]Non-serializable object error while working on Memcache

Hi everyone i was working with memcache, and when i compiled this code i got following errors. 大家好我正在使用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 sun.nio.ch.SelectionKeyImpl@7fdcde
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

I managed to fix it with converting User class toString but ı dont want to use toString method.I just want to use my class to add and get mwethods. 我设法修改它与转换User类toString,但我不想使用toString方法。我只是想使用我的类来添加和获取mwethods。 How can i fix this problem? 我该如何解决这个问题? Here is the code i am using. 这是我正在使用的代码。

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 , i forgot the User class, I am also giving you the User class to help me better. 对不起,我忘记了用户类,我也给你用户类来帮助我。

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


    }

Memcache doesn't know how to serialize your objects. Memcache不知道如何序列化您的对象。 You'll need to implement Serializable to have Java handle the serialization, or Externalizable if you need more control over the (de)serialization process. 您需要实现Serializable以使Java处理序列化,或者如果您需要对(de)序列化过程进行更多控制,则需要Externalizable

Updated due to question modification. 由于问题修改而更新。

So, your User class must implements the Serializable . 因此,您的User类必须实现Serializable Hopefully, this is as simple as writing 希望这就像写作一样简单

 public class User implements Serializable {
 ...
 }

as Serializable does not contains any method. 因为Serializable不包含任何方法。

This problem is coming because, JVM is not able to serialized object corrctly because of conflict in schema. 出现此问题的原因是,由于架构冲突,JVM无法严格序列化对象。 In my case, Serial version ID of some classes are defined 1L as default. 在我的例子中,某些类的Serial版本ID默认定义为1L。 These classes are corporately to each others. 这些课程是彼此合作的。 I assigned some unique custom value. 我分配了一些独特的自定义值。 My Problem resolved. 我的问题解决了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM