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代理,并且此代理不实现可序列化 (我的猜测是,这个不能序列化)。

任何帮助,高度赞赏。

+0

堆栈跟踪将会有帮助 – skaffman 2010-12-15 19:25:20

+0

CGLib代理是TestService的一个子类,因此实现了Serializable,不是吗?也许它通过实现writeObject方法来阻止序列化? – 2010-12-15 22:07:05

+0

@Christian:我的猜测是'TestService'对某个地方有一些不可序列化的引用。 – skaffman 2010-12-15 23:17:37

您应该只序列化“目标”。所以你有一个代理权的参考?将会出现该代理的目标,以便您可以序列化该代理。

要做的事情就是在序列化之前突破应用程序,并在该上下文中挖掘所需的属性。或者可能有一些代理使用情况或某事。

+0

CGLib代理是否以这种方式改变方法的行为:来自代理实例的调用会触发代理方法?如果是这样,解决方案中的反序列化TestService目标Michael将不再被代理,因此它将缺少代理添加到doSomethingMore()方法的任何行为。 – 2010-12-15 22:10:35

+0

否 - spring的默认aop不允许从实例内调用代理版本。 Spring的aop在方法级别工作,不会改变实际的类。 – 2010-12-15 22:13:23

+0

但是,您应该调查为什么代理在那里,目的是什么?如果它很重要,重新加载spring bean并代理它可能会很棘手。也许你应该将代理层从你序列化的对象中抽象出来 – 2010-12-15 22:15:16