web-dev-qa-db-ja.com

Javaでのシリアル化の目的は何ですか?

シリアライゼーションに関する記事をたくさん読んで、どのようにすてきで素晴らしいかを説明しましたが、十分な説得力のある議論はありませんでした。クラスをシリアル化することで本当に達成できることを誰かが本当に教えてくれるかどうか疑問に思っています。

98
m_a_khan

最初にシリアライゼーションを定義しましょう。次に、なぜそれがそんなに便利なのかを話しましょう。

シリアル化とは、単に既存のオブジェクトをバイト配列に変換することです。このバイト配列は、オブジェクトのクラス、オブジェクトのバージョン、およびオブジェクトの内部状態を表します。このバイト配列は、同じコードを実行するJVMの間で使用して、オブジェクトを送信/読み取りできます。

なぜこれをしたいのでしょうか?

いくつかの理由があります。

  • 通信:同じコードを実行している2台のマシンがあり、それらが通信する必要がある場合、簡単な方法は、1台のマシンが送信したい情報を持つオブジェクトを構築し、そのオブジェクトを他のマシンにシリアル化することです。これはコミュニケーションに最適な方法ではありませんが、仕事は完了します。

  • 永続性:特定の操作の状態をデータベースに保存する場合、バイト配列に簡単にシリアル化し、後で取得するためにデータベースに保存できます。

  • ディープコピー:exact Objectのレプリカが必要で、独自の専用clone()クラスを作成する手間をかけたくない場合は、単にオブジェクトをバイト配列にシリアル化します。その後、別のオブジェクトにデシリアライズすることでこの目標を達成します。

  • キャッシング:実際には上記のアプリケーションだけですが、オブジェクトのビルドに10分かかることがありますが、デシリアライズにかかる時間はわずか10秒です。そのため、メモリ内の巨大なオブジェクトを保持するのではなく、シリアル化を介してファイルにキャッシュし、後で必要に応じて読み込みます。

  • クロスJVM同期:シリアル化は、異なるアーキテクチャで実行されている異なるJVMで機能します。

175
Schmelter

アプリケーションを実行している間、そのオブジェクトはすべてメモリ(RAM)に保存されます。終了すると、そのメモリはオペレーティングシステムによって再利用され、プログラムは実行中に発生したすべてを本質的に「忘れ」ます。シリアル化は、アプリケーションがオブジェクトをディスクに保存することでこれを改善し、次回の起動時にオブジェクトを読み取れるようにします。アプリケーションが以前の状態を保存/共有する方法を提供する場合は、何らかの形式のシリアル化が必要になります。

54

私は自分の物語を共有することができ、それがシリアライゼーションが必要な理由をいくつかのアイデアを与えることを願っています。しかし、あなたの質問への答えはすでに非常に詳細です。

多数のテキストファイルを読み込んで読み取る必要のあるプロジェクトがいくつかありました。ファイルには、ストップワード、生物医学の動詞、生物医学の略語、意味的に相互に関連する単語などが含まれていました。これらのファイルの内容は単純です:words

次に、プロジェクトごとに、これらの各ファイルから単語を読み取り、それらを異なる配列に入れる必要がありました。ファイルの内容が変更されることはなかったため、最初のプロジェクトの後、それは共通の、しかし冗長なタスクになりました。

それで、私がしたことは、これらの各ファイルを読み取り、個々の配列(オブジェクトのインスタンス変数)を取り込むために1つのオブジェクトを作成したことです。次に、オブジェクトをシリアル化し、その後のプロジェクトでは、単にシリアル化を解除しました。私はファイルを読んで、何度も何度も配列にデータを追加する必要はありませんでした。

20
Rushdi Shams

本質的に

シリアル化は、相互参照を含むオブジェクトインスタンスのセットをバイトの線形ストリームに変換するプロセスで、ソケットを介して送信したり、ファイルに保存したり、単にデータストリームとして操作したりできます。

Wiki の用途を参照してください:

シリアル化には多くの利点があります。以下を提供します。

  1. オブジェクトのプロパティをディスク上のテキストファイルに書き込むよりも便利なオブジェクトを永続化し、これを再度読み込むことでオブジェクトを再構築する方法.
  2. sOAPなどのリモートプロシージャコールを発行する方法
  3. 特にCOM、CORBAなどのソフトウェアコンポーネントでオブジェクトを配布する方法.
  4. 時変データの変化を検出する方法。
3
Pool

最も明らかなのは、シリアル化されたクラスをネットワーク経由で送信でき、受信者が元のインスタンスの複製を作成できることです。同様に、シリアル化された構造をファイルシステムに保存できます。

また、シリアル化は再帰的であるため、必要に応じて、1つのスウェルフープで異種データ構造全体をシリアル化できます。

1
ddyer

学習の簡単な目的のために(学習、私は学習と言った、私は最高、または良いとさえ言わなかったが、物事を理解するためだけに)、あなたはデータをコンピューター上のテキストファイルに保存し、その後プログラムを持つことができるその情報を読み取り、ファイルに基づいて、プログラムに異なる応答をさせることができます。もっと高度なものであれば、必ずしもtxtファイルである必要はありませんが、何か他のものである必要があります。

一方、シリアル化は、物事を直接コンピューター言語に入れます。それはまるでスペイン語のコンピューターにフランス語で何かを言うのではなく、フランス語で何とかしてそれを強制的にフランス語を習得させ、すべてを翻訳してネイティブのスペイン語に物事を保存するようなものです。最も技術集約的な答えではなく、私はただ、共通言語形式で理解可能な例を作成しようとしています。

Javaではオブジェクトがヒープ上で処理され、スタック上のプリミティブとして表される場合よりもはるかに時間がかかるため、シリアル化も高速です。スピード、スピード、スピード。プログラマーの観点からすると、ファイル処理が少なくなります。

0
JCoder

シリアル化されたオブジェクトは、空間内の状態を維持し、ネットワーク、ファイルシステムなどを介して転送できます。また、時間は、オブジェクトを作成したJVMより長く存続できます。

これは便利な場合があります。

0
David Soroko

シリアル化されたオブジェクトを使用して、関数またはクラスコンストラクターに渡す引数を標準化します。 1つのシリアル化されたBeanを渡すことは、引数の長いリストよりもずっときれいです。結果は、読みやすくデバッグしやすいコードです。

0
Ron Norman