Java シリアル化アルゴリズムの分析
シリアル化はオブジェクトを一連のバイトとして記述するプロセスであり、逆シリアル化はこれらのバイトをオブジェクトに再構築するプロセスです。 Java Serialization API は、オブジェクトのシリアル化を処理するための標準メカニズムを提供します。ここでは、シリアル化が必要な場合にオブジェクトをシリアル化する方法と、シリアル化後のバイトがオブジェクトの情報をどのように記述するかを例を使用して説明します。
シリアル化の必要性
Java では、すべてがオブジェクトです。分散環境では、多くの場合、あるネットワークまたはデバイスから別のネットワークまたはデバイスにオブジェクトを転送する必要があります。これには、両端でデータを送信できるプロトコルが必要です。 Java シリアル化メカニズムは、この問題を解決するために作成されました。
オブジェクトをシリアル化する方法
オブジェクトをシリアル化可能にするための前提条件は、Serializable インターフェイスを実装することです。Serializable インターフェイスにはメソッドはなく、マーカーに似ています。このタグを持つクラスは、シリアル化メカニズムによって処理できます。
100。
オブジェクトのシリアル化形式
シリアル化後のオブジェクトはどのようになりますか?オブジェクトをシリアル化して出力したばかりの temp.out ファイルを開き、16 進数で表示します。内容は次のとおりです。
73 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 05
63 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 78
70 00 64
パブリックバイトバージョン = 100;
パブリックバイト数 = 0;
理論的には、これら 2 つのフィールドを格納するのに必要なバイト数は 2 バイトだけですが、実際には temp.out は 51 バイトを占めます。つまり、データに加えてシリアル化されたオブジェクトの他の記述も含まれることになります。
Java シリアル化アルゴリズム
シリアル化アルゴリズムは通常、次の手順を実行します。
◆オブジェクトインスタンスに関連するクラスメタデータを出力します。
◆スーパークラスがなくなるまで、クラスのスーパークラス記述を再帰的に出力します。
◆クラスメタデータが完成すると、最上位のスーパークラスから順にオブジェクトインスタンスの実データ値が出力されます。
◆インスタンスデータを上から下へ再帰的に出力
考えられるすべての状況をより完全にカバーする別の例で説明しましょう。
Serializable{ を実装するクラスが含まれています
int containsVersion = 11;
}
public class SerialTest extendsparent 実装 Serializable {
int バージョン = 66;
contains con = new contains();
public int getVersion() {
バージョンを返します。
}
public static void main(String args[]) throws IOException {
FileOutputStream fos = new FileOutputStream("temp.out");
ObjectOutputStream oos = 新しい ObjectOutputStream(fos);
SerialTest st = 新しい SerialTest();
oos.writeObject(st);
oos.flush();
oos.close();
}
}
シリアル化された形式は次のとおりです。
AC ED 00 05 7372 00 0A 53 65 72 69 61 6C 54 65
73 74 05 52 81 5A AC 66 02 F6 02 00 0249 00 07
76 65 72 73 69 6F 6E4C00 03 63 6F 6E74 00 09
4C63 6F 6E 74 61 69 6E 3B 7872 00 06 70 61 72
65 6E 74 0E DB D2 BD 85 EE 63 7A 02 00 0149 00
0D 70 61 72 65 6E 74 56 65 72 73 69 6F 6E 78 70
0000000A 0000004273 72 00 07 63 6F 6E 74
61 69 6E FC BB E6 0E FB CB 60 C7 02 00 0149 00
0E 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E 78
700000000B
これらのバイトが何を表すかを詳しく見てみましょう。初めに、色を参照してください:
シリアル化アルゴリズムの最初のステップは、オブジェクトの関連クラスの説明を出力することです。例で示したオブジェクトは SerialTest クラスのインスタンスなので、次に SerialTest クラスの記述が出力されます。色を参照:
次に、アルゴリズムはフィールドの 1 つ、inversion=66 を出力します。color を参照してください。
次に、アルゴリズムは次のドメインを出力します。 contains con = new contain(); これは少し特殊で、オブジェクトです。オブジェクト型参照を記述するときは、JVM の標準オブジェクト署名表記法を使用する必要があります。色を参照してください。
次に、アルゴリズムは、親クラスであるスーパー クラスの説明を出力します。色を参照してください。
次に、親クラスのドメインの説明を出力します (intparentVersion=100)。 color も参照してください。
これまでのところ、アルゴリズムはすべてのクラスの説明を出力しました。次のステップでは、インスタンス オブジェクトの実際の値を出力します。この時点では、親クラスのドメインから開始します。色を参照してください。
SerialTest クラスのフィールドもあります。
続くバイトはさらに興味深いものです。アルゴリズムは、contain クラスの情報を記述する必要があります。色を参照してください。
.contain の一意のドメインの説明を出力します、intcontainVersion=11;
このとき、シリアル化アルゴリズムは、contain にスーパークラスがあるかどうかを確認し、スーパークラスがある場合はそれを出力します。
最後に、包含クラスの実際のドメイン値が出力されます。
Java シリアル化のメカニズムと原則について説明しました。これが学生の役に立つことを願っています。