2009-05-21 17 views
11

私は、フレームワークがすべてがシリアライズ可能であると主張するJava Webアプリケーションを開発してきました。私はこれがフレームワークに固有のものではなく、JavaのWebアプリケーションに一般的であると考えています。私の質問は、フレームワーク/サーバ/何が何をしているのかということです。それはそれをしなくてはなりませんか?なぜJava Webアプリケーションでシリアル化が使用されていますか?

注:私は、Webアプリケーションまたは直列化について多くを知りません。

+0

関連エントリ:http://bit.ly/de9m0 – OscarRyz

答えて

16

典型的な問題は、彼らが回復したり共有することができるので、複製、またはサーバのシャットダウン時に、内部HTTPセッションが永続ストアに出て「直列化」であるということです。

シリアル化は、オブジェクトの状態を保存し、後でその状態を再構成することができるされています。

+1

サーブレットセッションはあらゆる種類のオブジェクトを保持できるので、シリアライズ可能な – OscarRyz

3

シリアライズは、Webアプリケーションだけでなく、あらゆるアプリケーション環境で役に立ちます。

シリアル化の主な用途の1つがトランスポート用です。オブジェクトをリモートコンピュータ、例えばUserProfileにコピーまたは移動したいとします。 UserProfileをシリアル化し、シリアル化されたデータ(通常はXML)を送信し、受信側の新しいオブジェクトにデシリアライズして、元のオブジェクトであるかのように操作できます。

もう1つの使用状態を保存しています。あなたはゲームを持っていて、ゲームボードの正確な状態を保存したいことがあります。 Boardオブジェクトを直列化することができます。このオブジェクトはその後、各タイルを直列化するように指示できます。

3

は、Webフレームワークによっては、セッション内のオブジェクトは、直列化を使用してディスクに永続化される可能性があります。

10

それはほとんどのアプリケーションのため厳密には必要ではないですが、二つの方法でパフォーマンスを助けることができる:

  • ユーザーセッションは、要求の間にディスクにシリアライズすることができます。同じユーザーからの要求間の時間が要求の処理に要する時間よりもはるかに長い場合、サーバーのメモリ使用量を大幅に削減し、より多くのユーザーにサービスを提供できるようになります。
  • 複数のサーバー上の要求を広めるためにロードバランシングを使用する場合は、同じユーザーによるすべての要求は常に(ロードバランサの柔軟性が減少)、同じマシンによって提供されていることを確認する必要がありますいずれか、またはあなたができるようにする必要がありますシリアライゼーションを介してサーバー間でセッションデータを移動します。
2

エンタープライズJava Bean(EJB)を使用し、ステートレスセッションBean APIを使用している場合、各SSBインスタンスは1つのJava仮想マシン上の1つのスレッドで実行され、そのクライアントは異なるスレッドで実行されます。一般的には、異なるコンピュータ上の異なるJVMにあります。 Javaオブジェクトへの参照をあるJVMから別のJVMに渡すことはできないため、オブジェクトを文字列にシリアライズして、別のJVMに送信してから、逆シリアル化してオブジェクトに戻す必要があります。このシリアライゼーション/デシリアライゼーションは、引数の入力と戻り値の出力の両方に発生します。

Java Message Serviceを使用している場合は、各メッセージで送信するオブジェクトがシリアル化されて文字列に変換され、データベースに保存され、メッセージ受信者によって別の時と場所でデシリアライズされます。

そして、ウィルアルトゥングが指摘するように、一般的なHTTPセッションオブジェクトは、JVM間で共有されています。 GlassFish Java EEアプリケーションサーバーのクラスタが電子商取引アプリケーションを実行している場合、各顧客の要求は使用可能なサーバーにロードバランシングされ、そのサーバーは顧客のセッション状態(顧客名、ショッピングカートなど)を検索できる必要があります。 )。それはシリアル化を介してのみ得ることができます。セッション状態は、安全のためにディスク(例えば、データベース)に書き込まれてもよい。

関連する問題