2012-04-05 2 views
1

実験として、私は 'load'を通してHibernateエンティティpojoをフェッチし、それを通常の直列化によってファイルに書きました。私はそのファイルを通常のデシリアライゼーションを通して別のプログラムを通して読み込み、リフレクションを使ってエンティティオブジェクトのプロキシクラスに含まれるフィールドとメソッドを見つけました。私を驚か何Java:シリアライゼーションは、Hibernateエンティティのためにストリーミングするメソッドコードも記述しますか?

は、それが(例えば「getHibernateLazyInitializer()」または「CGLIB $ SET_THREAD_CALLBACKS(net.sf.cglib.proxy.Callback [])」など私にプロキシクラスがそれに持っていたすべてのメソッドを示したということでした)

さらに、私はdeserializaedインスタンスで 'getHibernateLazyInitializer()'メソッドを呼び出すことができました!プロキシコードが動的に生成され、作成されたJVMがシャットダウンした後にそのクラスが存在しない場合、そのメソッドをどのように呼び出すことができましたか?メソッドのバイトコードも、プロキシを介してHibernate pojoのシリアル化/デシリアライズされますか?

答えて

0

私はもう少しデバッグを行い、プロキシされたインスタンスをシリアライズする間、Hibernateは実際にSerializableProxyのインスタンスを書き込むことを発見しました。これは、プロキシクラスが、このSerializableProxyインスタンスを返す 'writeReplace()'メソッドを持つインターフェイス 'HibernateProxy'を実装しているために発生します。

このインスタンスを直列化解除すると、SerializableProxyのreadResolve()は、SerializableProxyインスタンスで説明されている情報に基づいて作成され、順番にCGLib Enhancerを使用するHibernateProxyオブジェクトを起動して返します。だからこそ私はこれらの方法をすべて見て、それを呼び出すことができました。

ボトムライン:ストリームにメソッドコードが書き込まれていません。 HibernateはwriteReplaceを通してオブジェクト自体を変更し、readResolveとCGLIbを使ってそのオブジェクトが読み戻されたときにプロキシを再作成します。

0

いいえ、そうではありません。クラスパスがそのクラスを知らないJavaプロセスでオブジェクトを逆シリアル化しようとすると、エラーが発生します。

0

実際にシリアライズしたオブジェクトインスタンスはエンティティクラス自体ではなく、そのクラスを拡張するプロキシとして、デシリアライズするとエンティティインスタンスが戻ってくるのではなく、プロキシが戻ってくることが明らかです。

+0

私はプロキシとしてクラスを取り戻す必要があると私は理解していますが、どのように私はそのメソッドを見て、それらを呼び出すことができますか?プロキシクラスを作成したVMがシャットダウンしたら、プロキシクラスは存在しなくてはなりませんか? – shrini1000

関連する問題