Javaでのシリアル化:知っておくべきことすべて[2022]
公開: 2021-01-04IT業界のブームがますます高まる中、IT業界への依存度は日々高まっているようです。 この着実な成長により、多くの専門家は、業界内での関連性を維持するためにプログラミング言語を採用するようになりました。 業界はクライアントにサービスを提供するためにいくつかの言語を使用していますが、いくつかの言語は他の言語よりも頻繁に使用されています。 Javaはそのような言語の1つです。
あなたが新入生であるかベテランであるかに関係なく、Javaの確かな知識は、ソフトウェアの旅のあらゆる段階であなたに利益をもたらすでしょう。 他のプログラミング言語と同様に、Javaも独自の包括的なシラバスを備えています。 言語を句読するさまざまな概念をすべて把握するには、毎日言語を練習する必要があります。 ユーザーを大いに助けるそのような概念の1つは、Javaでのシリアル化の実践です。
目次
序章
Javaのコンテキストでのシリアル化とは、Javaコードオブジェクトが体系的にバイトストリームに変換されるプロセスを指します。 これは、あるJava仮想マシンから別のJava仮想マシンへの上記のオブジェクトコードの効率的な転送を可能にするために行われます。 その後、これにより、逆シリアル化の助けを借りてその再現が可能になります。 複数の目的を達成するためにシリアル化を使用します。 以下のセクションで最も人気があり関連性のあるものを見てみましょう。
なぜシリアル化が使用されるのですか?
オブジェクトをバイトのシーケンスとして表すという現象は、プログラミングパラダイム内でかなりの割合で使用されます。 プロセスがオブジェクトのデータの表現にも拡張されると、ユーティリティは何倍にもなります。 以下にリストされているのは、Javaでのシリアル化の最も一般的な使用法の一部です。
コミュニケーション
Javaでのシリアル化により、複数のコンピューターシステム間の効果的かつ迅速な通信が可能になります。 これらのユニットは、オブジェクトのシリアル化と送信を利用して、さまざまなオブジェクトの同時共有と設計を容易にします。 その結果、これにより、最終的な実行もスムーズになります。 大量のデータベースの場合、シリアル化により、オブジェクト処理への高度に合理化されたアプローチが可能になります。
キャッシング
キャッシングとは、広義には、最小限の時間を費やして、後でアクセスするための情報を保存する方法を指します。 Javaでのシリアル化は、大きなオブジェクトの逆シリアル化にかかる時間を最小限に抑えることで、キャッシュを促します。 オブジェクトの構築にかかる時間は、逆シリアル化にかかる時間と比較するとはるかに長いことはよく知られています。 したがって、シリアル化は、ミックス内の比較的大きなオブジェクトをキャッシュすることにより、この時間の消費を最適化するのに役立ちます。

ディープコピー
Javaでのディープコピーとは、ある程度の変更が加えられる可能性のある以前のバージョンに依存しないように、ツリーからオブジェクトをコピーするプロセスを指します。 このクローン作成プロセスは、シリアル化を採用することで非常に簡単になります。 オブジェクトをバイト配列にシリアル化し、続いてそれを逆シリアル化することにより、ユーザーはそのオブジェクトのレプリカを作成できます。
クロスJava仮想マシンの同期
シリアル化を実践する主な利点は、ユーザーがさまざまなJVM間で操作できるようになるという事実にあります。 シリアル化が採用されると、これらのJVMが同じアーキテクチャまたは異なるアーキテクチャとオペレーティングシステムで動作しているかどうかは関係ありません。
永続性
オブジェクトにシリアル化を適用することで、不便を感じることなく、アイテムの状態を直接保存できます。 さらに、ユーザーは、言及された状態をデータベースに保存して、後でいつでも取得できるようにすることもできます。
読む:Javaシリアル化インタビューの質問と回答
オブジェクトのシリアル化-関連するプロセス
オブジェクトのシリアル化を進める前に、まず、オブジェクトがシリアル化可能かどうかを確認する必要があります。 さて、どうやってそれを決定するのですか? Javaのオブジェクトは、そのクラスまたはその親クラスのいずれかがjava.io.Serializableインターフェースの実装を許可する場合にのみ、シリアライズ可能です。 これらのクラスがそのサブインターフェース(java.io.Externalizable)も実装している場合も、基準は満たされます。
上で説明したように、JVM間の同期は、シリアル化を使用する最も強力なアプリケーションの1つです。 オブジェクトをシリアル化するとき、このオブジェクトの状態をバイトストリームに変換します。 その結果、あるJava仮想マシンから別のJava仮想マシンにオブジェクトを転送することが可能になります。 したがって、このバイトストリームを元のオブジェクトに戻すこともできます。
この変換は、逆シリアル化とも呼ばれます。 これはシリアル化の逆のプロセスであり、以前にシリアル化された送信者からのオブジェクトのバイトストリームが受信側で再作成されます。
Javaでのシリアル化の利点
前のセクションでシリアル化の使用法とアプリケーションについて説明したときに、そのさまざまなメリットにすでにいくつかの光を当てました。 今こそ、それらをさらに深く掘り下げる時です。
- シリアル化の最も重要な利点の1つは、組み込み機能であるという事実です。 シリアル化を実装または実行するために、サードパーティのソフトウェアの助けを借りる必要はありません。
- 初心者でロープを習得しているばかりのユーザーにとっても、シリアル化は習得して理解するのにかなり簡単なプロセスです。
- 多くの場合、さまざまなプログラミングのバックグラウンドを持っている開発者は、新しい言語のニュアンスに対処する必要があるときに、タッチのバックグラウンドを取得します。 ただし、シリアル化の場合、プロセスは普遍的であるため、そこにいるすべての開発者にはかなり馴染みがあります。
- 使用と実装が簡単であるだけでなく、カスタマイズも同様に簡単です。
- 現在、運用にシリアル化を利用する重要なテクノロジーがいくつかあります。 これは、シリアル化されたデータストリームが暗号化、認証、圧縮、および安全なJavaコンピューティングをサポートしているためです。
Javaでのシリアル化のデメリット
100%完璧なプログラミング言語はなく、完璧であると主張することもできません。 結果として、それらを構成する概念とプロセスにも、独自の一連の欠陥がないわけではありません。 シリアル化のプロセスに関連する一般的な欠点のいくつかを次に示します。
- 一部のシリアル化プロセスでは、逆シリアル化を同時に適用する必要があります。 さて、逆シリアル化を適用することの欠点は、オブジェクトがもろくなることです。 結果として、前記オブジェクトが効果的に逆シリアル化されるという完全な確実性は決してありません。
- シリアル化のプロセスが呼び出されると、一連の一時変数が作成されます。 これらの一時変数は、作成されると、余分なメモリスペースを占有します。 ただし、これらのプロセス中にコンストラクターが呼び出されないため、これらの一時変数の多くは初期化に失敗します。 その後、それらは標準Javaフローのバリエーションに影響を与えることになります。
- すべての時間消費の最適化のために、メモリ使用率に関しては、シリアル化のプロセスはますます非効率的です。
- シリアル化のプロセスでは、JavaのすべてのStandardEditionごとに遷移制御メカニズムが提供されるわけではありません。 その結果、サードパーティのAPIを必要とせずに並列アクセスを必要とするアプリケーションと組み合わせて使用することは好ましくありません。
- シリアル化を使用している間、オブジェクトにアクセスするためのきめ細かいコントロールの取得について妥協しなければならないことがよくあります。
実用的なレンズを通して見たシリアル化
これまで、さまざまな長所と短所を含め、理論的な概念としてシリアル化のプロセスについて説明してきました。 今度は、実用的な観点とその実装の観点からシリアル化を視覚化することを可能にする議論を掘り下げる時が来ました。 以下にリストされているのは、シリアル化の実際の実現を理解するのに役立ついくつかのケースです。

必読:JavaBeansのプロパティと利点:どのように利用する必要がありますか?
シリアル化と継承
Javaでの継承は、あるクラスが別のクラスのメソッドとフィールドを取得または継承する現象として広く定義されています。 プロパティを継承するクラスをサブクラスと呼び、プロパティを継承するクラスをスーパークラスと呼びます。 スーパークラスという用語は、基本クラスおよび親クラスとも同じ意味で使用されます。
最初のケースは、スーパークラスのコンテキストでのシリアル化を扱います。 一般に、スーパークラスがシリアル化可能である場合、そのサブクラスもデフォルトでシリアル化可能であると見なすことができます。 もちろん、これはスーパークラスがSerializableインターフェースを実装している場合にのみ当てはまります。 ただし、スーパークラスがSerializableインターフェイスを実装していなくても、サブクラスをシリアル化できる場合もあります。
これは、サブクラスがその1つの容量でSerializableインターフェイスを実装することに成功したときに発生します。 スーパークラスがどのような状況でもSerializableインターフェイスを実装できない場合、サブクラス自体がSerializableインターフェイスを実装するときに、サブクラスのオブジェクトを手動でシリアル化できます。
場合によっては、ユーザーが3番目の可能性に遭遇することもあります。 この可能性は、スーパークラスがシリアライズ可能である場合に発生しますが、ユーザーはサブクラスに関してプロセスを採用する必要はありません。
このような状況では、サブクラスの不要なシリアル化を意識的に防ぐことができる方法があります。 これは、サブクラスにwriteObject()メソッドとreadObject()メソッドを実装することで実行できます。 ただし、これらのメソッドを実装するだけでは十分ではありません。 これらのメソッドを作成することに加えて、ユーザーは、前述のメソッドが実装からNotSerializableExceptionをスローしないようにする必要もあります。
静的メンバーを使用したシリアル化
シリアル化のプロセスが実装されると、プロセス内の静的フィールドメンバーを無視することになります。 これは主に、プロシージャとしてのシリアル化が、問題のオブジェクトの最新の状態に大きく関係しているためです。 その結果、クラスの特定のインスタンスに関連付けられたデータは正常にシリアル化されますが、それに関連する静的メンバーフィールドはシリアル化されません。
XMLドキュメントに関するシリアル化
JavaオブジェクトのXMLへのシリアル化は、さまざまな方法で実現できます。 主に、XMLEncoderとXMLDecoderを使用して実現されます。 JavaオブジェクトをXMLドキュメントにシリアル化する主な目的は、シリアル化のプロセスに本質的に伴うさまざまな欠点を制限しようとすることにあります。
シリアル化のプロセスで最も関連する問題の1つは、シリアル化されたオブジェクトを保存および復元するロジックが、構成クラスの内部構造のみに基づいていることです。 オブジェクトの保存から取得までの間にこれらのクラスに生じた可能性のある変更は考慮されません。 その後、これにより、逆シリアル化プロセスの差し迫った障害が発生します。
シリアル化により、バージョン管理の問題も発生します。 これは、ユーザーが1つのバージョンのクラスを使用してオブジェクトを保存したが、別のバージョンまたは新しいバージョンのクラスを使用して同じクラスを逆シリアル化しようとした場合に発生します。 この場合、逆シリアル化プロセスも失敗します。
したがって、これらすべての問題を回避するために、一部のユーザーは、オブジェクトをバイナリ形式にシリアル化する従来のアプローチを採用するよりも、オブジェクトをXMLドキュメントにシリアル化することを好みます。 さらに、JavaオブジェクトをXMLドキュメントにシリアル化することで、オブジェクトが人間が読める形式になり、優れた利便性が実現します。
チェックアウト:Javaインタビューの質問と回答
外部化可能なインターフェースを理解する
JavaのExternalizableインターフェースは、シリアル化インターフェースのインターフェースと非常によく似ています。 違いは、カスタマイズされたシリアル化を提供する能力にあります。 外部化可能なインターフェイスでは、ストリームに保存するオブジェクトを選択できますが、シリアル化インターフェイスでは同じ権限が付与されません。
java.ioで外部化可能なインターフェースを利用できます。 外部化可能なインターフェースは、ユーザーに2つの方法も提供します。 1つ目は、public void writeExternal(ObjectOutput out)がIOExceptionをスローすることです。 もう1つは、public void readExternal(ObjectOutput in)がIOExceptionをスローすることです。
シリアル化と外部化の違い
カスタマイズされたシリアル化を提供する機能とは別に、他のいくつかの重要な変数もシリアル化と外部化を区別します。 次のセグメントでは、それらを詳しく見ていきます。
実装
シリアライズ可能インターフェースと外部化可能インターフェースの主な違いの1つは、それらの実装にあります。 外部化可能なインターフェイスは、ユーザーがシリアル化するオブジェクトについて明示的に言及することを想定しています。 これは、シリアル化可能なインターフェイスを扱う場合には当てはまりません。 シリアル化可能なインターフェイスでは、実行時にすべてのオブジェクトと変数が区別なくシリアル化されます。
メソッド
外部化可能なインターフェースは、主に2つの方法で構成されています。 これらは、writeExternal()メソッドとreadExternal()メソッドです。 一方、シリアル化可能なインターフェイスには、メソッドは一切含まれていません。
プロセス
外部化可能なインターフェイスでシリアル化のプロセスを実行している場合、カスタマイズされたシリアル化の特権が与えられます。 一方、シリアル化可能なインターフェイスでは、デフォルトのシリアル化プロセスが適用されます。
下位互換性と制御
Externalizable Interfaceは、問題のバージョン管理を予約せずにシリアル化をサポートします。 このアプローチの唯一の問題は、スーパークラスをシリアル化するときにユーザーが自分で責任を負う必要があることです。 それどころか、シリアル化インターフェースでは、両端に同じバージョンのJVMが存在する必要があります。 ただし、スーパークラスを含むすべてのオブジェクトとクラスのデフォルトのシリアル化は可能です。
パブリックNo-Argコンストラクタ
シリアル化されたオブジェクトを再構築する際、外部化インターフェイスでは、パブリックの引数なしコンストラクターを使用する必要があります。 これは、引数なしのコンストラクターを明示的に必要としないシリアル化インターフェースの場合とは異なりますが、シリアル化されたオブジェクトとクラスを再構築するためにリフレクションを利用します。
Javaでのシリアル化:論争
Javaでのシリアル化の概念に付随する論争はかなりあります。 それらの多くは、そもそも手順としてのシリアル化の削除に関心を持っています。 オラクルのアーキテクトは、1997年の恐ろしい間違いであると見なしているため、Javaからシリアル化を削除することを長い間検討してきたと広く考えられています。
彼らの調査によると、シリアル化手順の設計の欠陥は、データ自体に脅威を与えるようなものです。 その点で、1997年のMark Reinholdは、Javaのすべての脆弱性のほぼ3分の1をシリアル化のプロセスに起因し、商はそれよりも快適である可能性があると述べています。

したがって、コンストラクトとしてのシリアル化は、今後のアップデートでJavaの年表から完全に削除または置き換えられる可能性があります。 これは、専門家の大多数が、シリアル化をJavaの初心者がプロジェクトに実装できる理想的なオプションと見なしていないためかもしれません。
また読む: Javaプロジェクトのアイデアとトピック
世界のトップ大学からソフトウェア開発コースを取得します。 エグゼクティブPGプログラム、高度な証明書プログラム、または修士プログラムを取得して、キャリアを早急に進めましょう。
結論
シリアル化に関する議論と審議は、そのベストプラクティスのいくつかに光を当てることによって結論付けることはできません。 最高のエクスペリエンスを保証するために、ユーザーが採用しなければならないものをいくつか紹介します。
- シリアル化可能なフィールドを示すには、javadoc@serialタグを使用する必要があります。
- シリアル化されたオブジェクトを表すファイルの場合、.ser拡張子を使用することをお勧めします。
- 通常、静的または一時的なフィールドをデフォルトのシリアル化にかけるプロセスは嫌われています。
- 絶対に必須でない限り、すべての状況下で、拡張可能クラスのシリアル化を回避するように努める必要があります。
- シリアル化を実装するときは、内部クラスがシリアル化プロセスに関与しないようにする必要があります。
Java、OOP、フルスタックソフトウェア開発の詳細に興味がある場合は、upGrad&IIIT-Bのフルスタックソフトウェア開発のエグゼクティブPGプログラムをチェックしてください。これは、働く専門家向けに設計されており、500時間以上の厳格なトレーニングを提供します。 9以上のプロジェクトと割り当て、IIIT-B卒業生のステータス、実践的な実践的なキャップストーンプロジェクト、トップ企業との雇用支援
