Java 不可序列化对象异常
我试图在Memcached客户机中设置对象列表(可序列化)。我是用set方法做的。我收到以下错误消息: 目标VM中发生异常:不可序列化对象 因此它不允许我在Java 不可序列化对象异常,java,serialization,memcached,Java,Serialization,Memcached,我试图在Memcached客户机中设置对象列表(可序列化)。我是用set方法做的。我收到以下错误消息: 目标VM中发生异常:不可序列化对象 因此它不允许我在MemcachedClient对象中设置值。这是我的密码: MemcachedClient client = CacheConnectionUtil.connectToCacheServer(this.applicationEnv); client.set(generateCacheKey(namespace, key), expireInS
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和将来找到您答案的其他用户。感谢提供详细的示例。问题是对象的一个相关类不可序列化。