CGLib和序列号
我想要做的是序列化一个类 实现一个命令模式,以便我可以稍后运行它。在世界上最好的 ,我想序列化一个匿名类(我 意识到这个问题)CGLib和序列号
是什么使得它有点复杂的是,我在弹簧environement和 匿名我希望序列化的类被定义在一个类中,该类将由CGLib代理 。
我的初步尝试:
public interface CallLater implements Serializeable {
public run();
}
@Service
public class TestService implements Serializeable {
public doSomethingMore() { /* Code */ }
public void doSomething() {
CallLater job = new CallLater() {
private static final long serialVersionUID = 4415017504667122645L;
@Override
public void run() {
doSomethingMore();
}
}
storeJob(job);
}
}
E.g的storeJob会序列化对象并将其存储供以后,它的 这部分失败。我没有包括这个代码,但是只是 ObjectOutputStream调用
我知道整个TestService类需要序列化。问题是 它包裹扔了一个CGLib代理,并且此代理不实现可序列化 (我的猜测是,这个不能序列化)。
任何帮助,高度赞赏。
您应该只序列化“目标”。所以你有一个代理权的参考?将会出现该代理的目标,以便您可以序列化该代理。
要做的事情就是在序列化之前突破应用程序,并在该上下文中挖掘所需的属性。或者可能有一些代理使用情况或某事。
CGLib代理是否以这种方式改变方法的行为:来自代理实例的调用会触发代理方法?如果是这样,解决方案中的反序列化TestService目标Michael将不再被代理,因此它将缺少代理添加到doSomethingMore()方法的任何行为。 – 2010-12-15 22:10:35
否 - spring的默认aop不允许从实例内调用代理版本。 Spring的aop在方法级别工作,不会改变实际的类。 – 2010-12-15 22:13:23
但是,您应该调查为什么代理在那里,目的是什么?如果它很重要,重新加载spring bean并代理它可能会很棘手。也许你应该将代理层从你序列化的对象中抽象出来 – 2010-12-15 22:15:16
堆栈跟踪将会有帮助 – skaffman 2010-12-15 19:25:20
CGLib代理是TestService的一个子类,因此实现了Serializable,不是吗?也许它通过实现writeObject方法来阻止序列化? – 2010-12-15 22:07:05
@Christian:我的猜测是'TestService'对某个地方有一些不可序列化的引用。 – skaffman 2010-12-15 23:17:37