2010-12-15 34 views
1

我想要做的是序列化一個類 實現一個命令模式,以便我可以稍後運行它。在世界上最好的 ,我想序列化一個匿名類(我 意識到這個問題)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

您應該只序列化「目標」。所以你有一個代理權的參考?將會出現該代理的目標,以便您可以序列化該代理。

要做的事情就是在序列化之前突破應用程序,並在該上下文中挖掘所需的屬性。或者可能有一些代理使用情況或某事。

+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