2010-12-15 9 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); 
    } 
} 

例えばザ・storeJobは、オブジェクトをシリアル化し、後でそれを格納し、それが失敗し この部分ですします。私はこれのコードを含まれていませんが、ちょうど ObjectOutputStreamの呼び出し

私は、TestServiceクラス全体をシリアル化する必要があることを知っています。問題は で、CGLibプロキシが投げられ、このプロキシはシリアル化可能な を実装していません(これはシリアル化できないと思います)。

ご協力いただきまして誠にありがとうございます。

+0

スタックトレースが役に立ちます – skaffman

+0

CGLibプロキシはTestServiceのサブクラスなので、Serializableを実装していますか?おそらく、writeObjectメソッドを実装してシリアル化を防ぐのでしょうか? –

+0

@Christian:私の推測では、 'TestService'はどこかで非直列化可能なものへの参照を持っています。 – skaffman

答えて

0

"ターゲット"のみをシリアル化する必要があります。だから、プロキシ権の参照がありますか?そのプロキシのターゲットを取得して、それをシリアル化できるようになります。

するべきことは、シリアル化の直前にアプリケーションをブレークして、必要なプロパティのコンテキストを掘り下げることです。あるいは、プロキシのユーティリティや何かがあるかもしれません。

+0

CGLibプロキシは、プロキシされたインスタンス内からの呼び出しがプロキシされたメソッドをトリガするようにメソッドの動作を変更しますか?この場合、ソリューション内の逆シリアル化されたTestServiceターゲットMichaelはプロキシされなくなるため、プロキシがdoSomethingMore()メソッドに追加する動作が不足します。 –

+0

ノンスプリングのデフォルトaopは、インスタンス内からプロキシバージョンの呼び出しを許可しません。 SpringのAOPはメソッドレベルで動作し、実際のクラスは変更されません。 –

+0

しかし、なぜプロキシがあるのか​​を調べる必要がありますが、目的は何ですか?重要な場合は、春のbeanをリロードして、それをプロキシすることも難しいかもしれません。たぶん、あなたは、シリアル化しているオブジェクトから離れてプロキシ層を抽象化する必要があります –

関連する問題