Javaでのシリアライゼーションの目的は何ですか?


105

私は、シリアライゼーションに関するかなりの数の記事を読んで、それがいかに素晴らしくてすばらしいかを読みましたが、十分な説得力のある議論はありませんでした。誰かが本当にクラスをシリアル化することで本当に何ができるのか教えてもらえるだろうか?


10
彼らの議論について「説得力がなかった」とは?そして、なぜあなたの質問に対する答えを受け入れなかったのですか?
アノン。

8
彼は彼らが彼の質問に答えた「確信しなかった」。
Anthony Forloney、2010

5
提供された答えは、実際には正しかった。それらがうまくいかない場合は、コメントとして返信し、単に無視するのではなく解決策を試してみてください。そして、SOを正しく使用していないと指摘されたときに、他の人を非難し始めます。
アノン。

4
Anonは、質問の重複を防ぐことで、サイトの品質に貢献しています。同じことをたずねている5つの別々の質問を見るのはばかげています。答えが得られない場合は、それが正しい場合もあります。回答を得ても機能しない場合は、コメントで議論を続けてください。SOは、適切な質問をしたり、十分な回数質問したり、適切な専門家の目を引く場合に、魔法のように答えを出す魔法の箱ではありません。
クリス

1
どちらか:(回答を受け入れる)または(コメントを投稿するか、必要でない理由を説明する質問を修正します)。
アノン。

回答:


182

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

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

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

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

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

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

  • ディープコピー:オブジェクトの正確なレプリカが必要で、独自の特殊なclone()クラスを作成する手間をかけたくない場合は、オブジェクトをバイト配列にシリアル化してから、別のシリアル化を解除しますオブジェクトはこの目標を達成します。

  • キャッシング:実際には上記のアプリケーションにすぎませんが、オブジェクトのビルドには10分かかりますが、シリアル化解除には10秒しかかかりません。したがって、メモリ内の巨大なオブジェクトを保持するのではなく、シリアル化を介してファイルにキャッシュし、後で必要になったときにそれを読み取ります。

  • クロスJVM同期:シリアライゼーションは、さまざまなアーキテクチャーで実行されているさまざまなJVMで機能します。


62
一体何を構築するのに10分かかりますか?
oxbow_lakes 2010

2
(もちろん)シリアル化に関係するファイルI / Oは、純粋なオブジェクト作成のオーバーヘッドを小さくする可能性が高いと私は言います。科学的モデリングのような計算上非常に高価なものについて話しているかもしれませんが、スキーマの変更を処理するのが難しいため、シリアル化は永続化のための非常に貧弱なメカニズムです
oxbow_lakes

11
@oxbow_lakesたとえば、高速検索のために特定のデータセットのインデックスを保持している場合などです。このようなインデックスは、構築に非常に長い時間がかかる可能性がありますが、いったん構築すると、比較的迅速にシリアル化/非シリアル化できます。
David

Webアプリのリクエストが宛先に到達する前に地球上のすべてのルーターを通過する必要がある場合、オブジェクトを構築し、可能な最長のパスを使用してオブジェクトを返します。はい、10分かかることがあります。
Vaibs、

@Schmelter、あなたはシリアライゼーションが通信に最適な方法ではないと述べているので、それはその時に実装するのに適した最適な方法ですか?
Ashfaque Rifaye 2018年

58

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


2
それで、データをファイルに書き込み、必要に応じてそれを読み取るより良い、より効率的な方法のように思えますか?
m_a_khan 2010

1
これが唯一の実際の説明です。シリアライゼーション+1の他の現実的なアプリケーションは考えられません
エミリー

短くて甘い。完璧な説明。
Yakhoob 2017年

21

私は自分のストーリーを共有できます。シリアライズが必要な理由がいくつかわかるといいですね。しかし、あなたの質問への答えはすでに驚くほど詳細です。

たくさんのテキストファイルを読み込んで読み取る必要のあるプロジェクトがいくつかありました。ファイルに含まれるストップワードは、生物医学動詞は、生物医学略語は、言葉は意味的に相互に接続され、これらのファイルの内容は、シンプルなど、次のとおりです。言葉

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

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


1
そのような場合、それらをバイト配列ストリームに格納する必要があるのはなぜですか(シリアライズを使用)、一時フィールドを使用するよりも簡単でしょうか?
kidnan1991

3

本質的には

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

Wikiからの使用法を参照してください。

シリアル化には多くの利点があります。それは提供します:

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

1

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

また、シリアル化は再帰的であるため、必要に応じて、異種データ構造全体を1つのスウェルグループでシリアル化できることに注意してください。


0

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

時々これは役に立ちます。


これは、テキストを含む単純なファイルでも実現できます。シリアル化されたオブジェクトを読み取ってから、テキストファイルに書き込まれたオブジェクトの状態を読み取る方が少し簡単ですよね?
m_a_khan 2010

@m_a_khan:うわー。はい、それは単純なテキストで行うことができます。しかし、オブジェクトがより複雑になるか、または構造(構成、継承)がより複雑になるとすぐに、オブジェクトを手動で(アン)マーシャルするのが面倒になります。オブジェクトメンバーとしてリスト、セット、マップがあると想像してください。
ダークシューマッハ

異なるシリアル化スキームを考え出すのは簡単であり、実際に多くのものが存在します。非常に正当な理由により、「単純なテキスト」で一般的なケースをもたらすものはありません
David Soroko

0

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


1
私の意見では、シリアライゼーションと単一の構成オブジェクトをパラメーターとして使用することは非常に直交しています。おそらくこれは典型的なユースケースではありません。
ガーボルBakos

0

学習の単純な目的のために(通知、私は学習と言った、私は最高とは言いませんでしたが、単に理解するために)、データをコンピューター上のテキストファイルに保存して、プログラムを作成することができますその情報を読み取り、ファイルに基づいて、プログラムに異なる応答をさせることができます。より高度な場合は、必ずしもtxtファイルでなくてもかまいません。

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

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


平易な英語で物事を書き込もうとしている間、シリアライゼーションを実際に役立つ方法で説明していません。
user3516726 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.