Java 不可序列化对象异常

Java 不可序列化对象异常,java,serialization,memcached,Java,Serialization,Memcached,我试图在Memcached客户机中设置对象列表(可序列化)。我是用set方法做的。我收到以下错误消息: 目标VM中发生异常:不可序列化对象 因此它不允许我在MemcachedClient对象中设置值。这是我的密码: MemcachedClient client = CacheConnectionUtil.connectToCacheServer(this.applicationEnv); client.set(generateCacheKey(namespace, key), expireInS

我试图在Memcached客户机中设置对象列表(可序列化)。我是用set方法做的。我收到以下错误消息:

目标VM中发生异常:不可序列化对象

因此它不允许我在
MemcachedClient
对象中设置值。这是我的密码:

MemcachedClient client = CacheConnectionUtil.connectToCacheServer(this.applicationEnv);
client.set(generateCacheKey(namespace, key), expireInSeconds, value);
// value is a list of objects that implements serializable

为什么我会收到此错误消息?

请确保您的对象实现了可序列化的
(甚至是从您的对象引用的所有对象)

可能无法序列化
MemcachedClient
类中的对象。您有两个选项来解决此问题:

  • 确保那里的所有类都实现了可序列化的
    接口

    public class MemcachedClient {
    
        //AnotherClass must implement Serializable too.
        private AnotherClass anotherClassInstance;
    }
    
  • 如果另一个类没有实现
    Serializable
    (并且您不能修改这些类使其
    Serializable
    ),则添加
    transient
    关键字,这样这些对象就不会被序列化

    public class MemcachedClient {
    
        //AnotherClass doesn't implement Serializable.
        private transient AnotherClass anotherClassInstance;
    }
    
  • 如果在反序列化
    MemcachedClient
    对象时必须拥有另一个类的实例,则可以编写
    readObject(ObjectInputStream is)
    以根据需要创建实例:

    public class MemcachedClient {
    
        //AnotherClass doesn't implement Serializable.
        private transient AnotherClass anotherClassInstance;
    
        private void writeObject(ObjectOutputStream os) throws IOException, ClassNotFoundException {
            os.defaultWriteObject();
        }
    
        private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException {
            is.defaultReadObject();
            anotherClassInstance = new AnotherClass();
            //more logic to get a consistant AnotherClass instance.
        }
    }
    

    根据Brian的评论,假设这个
    MemcachedClient
    类来自第三方库,并且您不能修改它,那么您将遇到第2点中描述的场景:

    public class MyClass {
    
        //MemcachedClient can't be modified and doesn't implement Serializable interface
        //the only solution would be using the transient modifier
        private transient MemcachedClient memcachedClient;
    
        //MyClass attributes and methods...
    
        //If you need to keep a MemcachedClient instance when deserializing the object
        //just write the readObject method
    
        private void writeObject(ObjectOutputStream os) throws IOException, ClassNotFoundException {
            os.defaultWriteObject();
        }
    
        private void readObject(ObjectInputStream is) throws IOException, ClassNotFoundException {
            is.defaultReadObject();
            memcachedClient= new MemcachedClient();
            //more logic to get a consistant MemcachedClient instance.
        }
    }
    

    Serializable
    javadocs:

    在遍历图形时,可能会遇到不支持
    Serializable
    接口的对象。在这种情况下,将抛出
    NotSerializableException
    ,并标识不可序列化对象的类

    Memcached似乎隐藏了异常消息的其余部分,因此您必须自己识别不可序列化的对象

    您说
    是您自己对象的列表。我猜您的对象包含的东西不可
    序列化
    ,或者它包含的东西包含的东西不可
    序列化
    。浏览列表中的对象类,确保其下的每个对象都实现了
    Serializable

    例如,如果我有
    A
    实现
    可序列化

    public class A implements Serializable {
        private B b;
        // ...
    }
    
    B
    不会:

    public class B { ... }
    

    然后,任何尝试使用
    ObjectOutputStream
    序列化
    A
    (这可能是Memcached库中的默认序列化程序正在执行的操作)都将抛出
    NotSerializableException
    ,因为其字段
    private B
    ,是不可序列化的类型,这就是你得到的。

    我在序列化列表方面也遇到了类似的问题。我的问题是我使用的是List.subList,即使该列表只包含可序列化的项,但subList返回的列表是不可序列化的。一个快速的解决办法是做如下事情

    List mySublist = new ArrayList().addAll(originalList.subList(...));
    

    您的对象是否具有可序列化的实现?是的,它实现了可序列化,并在post中添加了代码。
    MemcachedClient
    来自,并且类本身与其实际值无关problem@Brian如果这是OP的问题,那么我的答案中的理论和示例将帮助他/她解决真正的问题(这没有发布到任何地方)。绝对同意,因此您的答案应该更通用,而不是使用
    MemcachedClient
    类,以避免混淆OP和将来找到您答案的其他用户。感谢提供详细的示例。问题是对象的一个相关类不可序列化。