例を使用したJavaのシリアル化可能なインターフェイス
公開: 2021-11-29Javaはいくつかのパッケージを提供しており、そのうちの1つはSerializableインターフェースです。 これは、Javaパッケージjava.io内に存在し、マーカーインターフェイスの一種です。 マーカーインターフェイスとして定義されている場合、インターフェイスにはメソッドやフィールドはありません。 したがって、クラスがインターフェースを実装するときはいつでも、インターフェースはメソッドを実装する必要はありません。 クラスがインスタンスをシリアル化または逆シリアル化する必要がある場合、クラスはインターフェイスを実装します。
シリアル化のメカニズムは、オブジェクトの状態をバイトのストリームに変換するために使用されます。 このメカニズムは、ObjectOutputStreamを使用して実行されます。 デシリアライズのプロセスは、シリアライズのプロセスの正反対です。 この場合、バイトストリームはJavaのオブジェクトに変換されます。 ObjectInputStreamは逆シリアル化に使用されます。
目次
シリアル化
オブジェクトの状態をバイトのストリームに変換することは、シリアル化と呼ばれます。 そして、シリアル化の反対は逆シリアル化です。 Javaのオブジェクトは、静的バイトのストリームに変換できます。 この静的ストリームは、データベースに保存することも、別のネットワークに転送することもできます。 シリアル化のプロセスはインスタンスに依存します。 これは、オブジェクトのシリアル化を1つのプラットフォームで実行してから、オブジェクトの逆シリアル化を別のプラットフォームで実行できることを意味します。 シリアル化プロセスには、特定のタイプのマーカーインターフェイス「Serializable」が実装されています。 したがって、シリアル化に適格なクラス、つまりJavaのシリアル化可能なクラスは、マーカーインターフェイスを実装する必要があります。
オブジェクトの状態をバイトのストリームに書き込むこのメカニズムは、シリアル化と呼ばれます。 このメカニズムは、主にJMS、EJB、JPA、RMI、およびHibernateテクノロジーで使用されます。
ObjectInputStreamとObjectOutputStreamは、java.io.InputStreamとjava.io.OutputStreamを拡張する高レベルクラスの形式です。 プリミティブ型とオブジェクトグラフは、ObjectOutputStreamによって1バイトでOutputStreamに書き込むことができます。
ストリーム。 変換の結果として生じるストリームは、ObjectInputStreamを介して読み取ることができます。 したがって、シリアル化の場合、メソッドwriteObject()はObjectOutputStreamから呼び出され、逆シリアル化の場合、メソッドreadObject()はObjectInputStreamクラスから呼び出されます。
ObjectOutputStreamで最も重要なメソッドは次のとおりです。
上記のコード行は、https://www.baeldung.com/java-serializationから取得されています。
上記のコード行では、シリアル化可能なオブジェクトが取得され、それがストリームまたはバイトのストリームに変換されます。
ObjectInputStreamの場合、最も重要なメソッドは次のとおりです。
上記のコード行は、https://www.baeldung.com/java-serializationから取得されています。
上記のコード行は、バイトシーケンスを読み取り、このバイトストリームをJavaのオブジェクトに変換できます。 これにより、元のオブジェクトをキャストバックできます。
シリアル化プロセスの図は、以下で説明できます。
クラス「Person」はシリアル化の対象と見なされます。 静的フィールドはシリアル化されておらず、いくつかのクラスに属しています。 シリアル化のプロセスでキーワード「transient」を使用すると、クラスフィールドを無視できます。
ソース
人物タイプのオブジェクトをローカルファイルに保存してから、値を読み戻すことができます。以下に示すコードは、この目的に使用できます。
ObjectOutputStreamは、FileOutputStreamを使用してオブジェクトの状態をファイルに保存するために使用されました。 この例では、「yourfile.txt」という名前のファイルがプロジェクトのディレクトリに作成されています。 FileInputStreamを使用して、作成されたファイルがロードされます。 次に、このストリームはObjectInputStreamによって取得され、p2という名前の新しいオブジェクトに変換されます。 ロードされたオブジェクトの状態が最終的にテストされ、元のオブジェクトの状態と一致します。 ロードされるオブジェクトは、一般の人に明示的にキャストする必要があります。
Javaシリアル化の警告
1.継承と構成
ユーザーがインターフェースjava.io.Serializableを実装するときはいつでも、インターフェースを実装するすべてのクラスサブクラスがシリアライズ可能になります。 また、オブジェクトが別のオブジェクトへの参照を保持している場合、インターフェイスを実装するために参照されるオブジェクトは個別にシリアル化できます。 これらのオブジェクトがインターフェースを実装していない場合、例外がスローされます。 スローされる例外はNotSerializableExceptionになります。 また、オブジェクトの配列がシリアル化可能なオブジェクトに格納されていると仮定すると、すべての配列オブジェクトをシリアル化する必要があります。 オブジェクトのシリアル化が発生しない場合は、例外「NotSerializableException」がスローされます。
2.シリアルバージョンUID
Serializableインターフェイスを実装するすべてのクラスについて、番号が各クラスに関連付けられています。 この番号は、Java仮想マシンに関連付けられています。 これは主に、ロードおよび保存されるオブジェクトが正確な属性を持っていることを確認するために行われます。 属性が同じである場合にのみ、オブジェクトはシリアル化時に互換性があります。 IDEはこれらの番号を自動的に生成し、主にクラスの名前、その属性、およびそれに関連付けられたアクセス修飾子に基づいています。 変更の結果として異なる数値が発生した場合、例外「InvalidClassException」がスローされます。
serialVersionUIDがシリアライズ可能なクラスによって宣言されていない場合、JVMは実行時に自動的にそれを生成します。 番号は自動生成されますが、クラスがserialVersionUIDを宣言することをお勧めします。 これは、自動的に生成されるserialVersionUIDがコンパイラに依存し、予期しないInvalidClassExceptionsをスローする場合があるためです。
3.カスタムシリアル化
オブジェクトをシリアル化するためのデフォルトの方法がJavaで設定されています。 Javaは、このデフォルトの動作をオーバーライドできます。 カスタムシリアル化の方法があります。 これは、シリアル化できない属性を持つオブジェクトをシリアル化しようとしている場合に特に役立ちます。 このようなオブジェクトのシリアル化は、ユーザーがシリアル化するクラス内の2つのメソッドを介して実行できます。 これらの2つの方法は次のとおりです。
上記の2つの方法を使用して、以前はシリアル化できなかった、シリアル化できる任意の形式に属性をシリアル化できます。
Javaでのシリアル化の利点
Javaでのシリアル化の利点の1つは、オブジェクトの状態をネットワーク上で移動できることです。
Javaインターフェースjava.io.Serializable
java.io.Serializableはマーカーインターフェースであり、インターフェース内にメソッドとオブジェクトがないことを意味します。 マーカーインターフェイスの主な機能は、
クラスのすべてのオブジェクトに特定の機能を提供するJavaのクラス。 マーカーインターフェイスの例は、リモートおよびクローン可能です。
インターフェイスは、オブジェクトをシリアル化するためにインターフェイスを使用するクラスによって実装される必要があります。 デフォルトでは、ラッパークラスやStringクラスなどのクラスは、インタフェースjava.io.Serializableを実装します。
Javaのシリアル化可能な例を以下に示します。
上記のコードでは、クラスStudentがSerializableインターフェースを実装していることがわかります。 したがって、クラスがSerializableインターフェースを実装すると、クラス内のオブジェクトをストリームのバイトに変換できます。
ObjectOutputStreamクラス
このクラスは、プリミティブ型のデータとJavaオブジェクトをOutputStreamに書き込むために使用されます。 インターフェイスjava.io.Serializableをサポートするオブジェクトは、ストリームに書き込まれるために使用できます。
ObjectInputStreamクラス
ObjectOutputStreamを使用して書き込まれたすべてのプリミティブデータは、ObjectInputStreamを使用して逆シリアル化されます。
JavaのSerializableインターフェースの例を以下に示します。
この例では、クラスStudentがシリアル化されます。 クラスObjectOutputStreamのメソッドwriteObject()は、オブジェクトをシリアル化するためのすべての機能を提供します。 オブジェクトの状態は、f.txtという名前のファイルに保存されます。
結論
この記事では、Javaでのシリアル化の概念について説明しました。 クラスのオブジェクトをシリアル化するために必要なインターフェースとその他の重要なメソッドをリストアップしました。 シリアル化のプロセスは、すべてのシリアル化可能なクラスのIDまたは番号に常に関連付けられています。 この番号はSerialVersionUIDと呼ばれます。 SerialVersionUIDの主な用途は、シリアル化されるオブジェクトの送信者と受信者を確認することです。 これは、送信者と受信者の両方が同じである必要があるためです。
これはプログラミング言語Javaの重要な機能です。 Javaのこのような重要な機能と概念について詳しく知り、プログラミング言語のスキルを習得したい場合は、upGradが提供するソフトウェアエンジニアリングコースを確認してください。 あなたが働く専門家であるならば、コースはあなたに最も適しています。 どんな形式の質問でも、私たちの支援チームに連絡することができます。 また、特定のコースについては、当社のWebサイトを参照して、詳細情報を入手することもできます。 シリアル化可能なインターフェイスは、マーカーインターフェイスです。 マーカーインターフェイスは、実装クラスがそれ自体をシリアル化できるようにするためのヒントをJavaランタイムに提供します。 ランタイムは、このインターフェースを利用してオブジェクトをシリアル化します。 Javaのシリアル化可能なインターフェイスは、Javaのデータクラスによって実装される特別なインターフェイスです。 クラスがこのインターフェースを実装すると、データベースに永続化できます。 このインターフェースはjava.ioパッケージで宣言されています。 シリアル化可能なインターフェイスには、readResolve()とwriteReplace()の2つのメソッドがあり、これらはデータベース内のオブジェクトの読み取りと書き込みに使用されます。 JavaでSerializableインターフェースを実装するということは、Serializableインターフェースを持つ任意のシステムでシリアル化および逆シリアル化できるオブジェクトを持つことを意味します。 このようなインターフェイスの実装は、クラスがサードパーティのライブラリ(JSON、XMLなど)またはネットワークプロトコルによって外部でシリアル化されている場合に効果的です。 変数がSerializableとして宣言されている場合、変数の各インスタンスは、パラメーターとしてメソッドに渡される場合、またはメソッドから返される場合に、シリアル化および逆シリアル化されます。 シリアル化はプログラムで実行されるため、オブジェクトの状態は、後で逆シリアル化してオブジェクトのユーザーに提示する必要がある場合に備えて保存できます。 シリアル化されたオブジェクトは、バイトのストリームを含むオブジェクトです。 オブジェクトのコンストラクターまたはwriteObject()/ readObject()メソッドは、バイトのストリームをオブジェクトに配置するために使用されます。 保存されるデータは、テキスト、オーディオ、ビデオ、または任意のカスタムアプリケーションデータです。 これらのオブジェクトのデータは、ファイルまたはリモートサーバーに保存できます。 ネットワーク経由でシリアル化されたオブジェクトを転送するには、RMI(Remote Method Invocation)プロトコルを使用する必要があります。 RMIは、分散アプリケーションを作成するための優れたプロトコルです。 これにより、クライアントはサーバー上で実行されているJavaアプリケーションのオブジェクトのメソッドと通信できます。 RMIプロトコルは、リモートプロシージャコール(RPC)メカニズムです。 Javaのシリアル化可能なインターフェイスとは何ですか?
JavaでSerializableインターフェースを実装するとどうなりますか?
シリアル化されたオブジェクトをネットワーク経由で転送できますか?