私は、シリアライゼーションに関するかなりの数の記事を読んで、それがいかに素晴らしくてすばらしいかを読みましたが、十分な説得力のある議論はありませんでした。誰かが本当にクラスをシリアル化することで本当に何ができるのか教えてもらえるだろうか?
私は、シリアライゼーションに関するかなりの数の記事を読んで、それがいかに素晴らしくてすばらしいかを読みましたが、十分な説得力のある議論はありませんでした。誰かが本当にクラスをシリアル化することで本当に何ができるのか教えてもらえるだろうか?
回答:
最初にシリアライゼーションを定義しましょう。それから、なぜそれがそんなに便利なのかについて話しましょう。
シリアル化は、既存のオブジェクトをバイト配列に変換するだけです。このバイト配列は、オブジェクトのクラス、オブジェクトのバージョン、およびオブジェクトの内部状態を表します。このバイト配列は、同じコードを実行しているJVM間で使用して、オブジェクトを送信/読み取ることができます。
なぜこれをしたいのでしょうか?
いくつかの理由があります。
通信:同じコードを実行している2台のマシンがあり、それらが通信する必要がある場合、簡単な方法は、1台のマシンが送信したい情報を持つオブジェクトを構築し、そのオブジェクトを他のマシンにシリアル化することです。それはコミュニケーションの最良の方法ではありませんが、仕事を成し遂げます。
永続性:特定の操作の状態をデータベースに保存する場合は、バイト配列に簡単にシリアル化して、後で取得できるようにデータベースに保存できます。
ディープコピー:オブジェクトの正確なレプリカが必要で、独自の特殊なclone()クラスを作成する手間をかけたくない場合は、オブジェクトをバイト配列にシリアル化してから、別のシリアル化を解除しますオブジェクトはこの目標を達成します。
キャッシング:実際には上記のアプリケーションにすぎませんが、オブジェクトのビルドには10分かかりますが、シリアル化解除には10秒しかかかりません。したがって、メモリ内の巨大なオブジェクトを保持するのではなく、シリアル化を介してファイルにキャッシュし、後で必要になったときにそれを読み取ります。
クロスJVM同期:シリアライゼーションは、さまざまなアーキテクチャーで実行されているさまざまなJVMで機能します。
アプリケーションを実行している間、そのオブジェクトはすべてメモリ(RAM)に格納されます。終了すると、そのメモリはオペレーティングシステムによって再利用され、プログラムは実行中に発生したすべてのことを基本的に「忘れます」。シリアライゼーションは、アプリケーションがオブジェクトをディスクに保存できるようにすることでこれを改善し、次回の起動時にオブジェクトを読み取れるようにします。アプリケーションで以前の状態を保存または共有する方法を提供する場合は、何らかの形式のシリアル化が必要になります。
私は自分のストーリーを共有できます。シリアライズが必要な理由がいくつかわかるといいですね。しかし、あなたの質問への答えはすでに驚くほど詳細です。
たくさんのテキストファイルを読み込んで読み取る必要のあるプロジェクトがいくつかありました。ファイルに含まれるストップワードは、生物医学動詞は、生物医学略語は、言葉は意味的に相互に接続され、これらのファイルの内容は、シンプルなど、次のとおりです。言葉!
次に、プロジェクトごとに、これらの各ファイルから単語を読み取り、それらを異なる配列に配置する必要がありました。ファイルの内容は変更されなかったため、最初のプロジェクトの後で、共通の、しかし冗長なタスクになりました。
したがって、私が行ったのは、これらの各ファイルを読み取り、個々の配列(オブジェクトのインスタンス変数)を設定するために1つのオブジェクトを作成したことです。次に、オブジェクトをシリアル化し、その後のプロジェクトでは、単にそれらを逆シリアル化しました。ファイルを読んでアレイに何度もデータを入力する必要はありませんでした。
シリアライゼーションは、相互参照を含むオブジェクトインスタンスのセットをバイトの線形ストリームに変換するプロセスです。これは、ソケットを介して送信したり、ファイルに保存したり、単にデータのストリームとして操作したりできます。
Wikiからの使用法を参照してください。
シリアル化には多くの利点があります。それは提供します:
- ディスク上のテキストファイルにオブジェクトのプロパティを書き込み、これを再度読み込んで再アセンブルするよりも便利な、オブジェクトを永続化する方法。
- SOAPなどのリモートプロシージャコールを発行する方法
- 特にCOM、CORBAなどのソフトウェアコンポーネントでオブジェクトを配布する方法
- 時変データの変化を検出する方法。
シリアル化されたオブジェクトは、状態を空間で維持し、ネットワーク、ファイルシステムなどを介して転送できます。また、オブジェクトは、それらを作成したJVMよりも長く存続できます。
時々これは役に立ちます。
学習の単純な目的のために(通知、私は学習と言った、私は最高とは言いませんでしたが、単に理解するために)、データをコンピューター上のテキストファイルに保存して、プログラムを作成することができますその情報を読み取り、ファイルに基づいて、プログラムに異なる応答をさせることができます。より高度な場合は、必ずしもtxtファイルでなくてもかまいません。
一方、シリアライズは、物事をコンピューター言語に直接入れます。まるでスペイン語のコンピューターにフランス語で何かを教えるのではなく、フランス語で何かを教えるのではなく、強制的にフランス語を学習させ、すべてを翻訳してネイティブのスペイン語に物事を保存するようなものです。最も技術集約的な答えではなく、私は一般的な言語形式で理解できる例を作成しようとしています。
Javaではオブジェクトがヒープ上で処理されるため、シリアライゼーションも高速になり、スタック上でプリミティブとして表される場合よりもはるかに時間がかかります。スピード、スピード、スピード。プログラマの観点から見ると、ファイル処理が少なくて済みます。