Javaのシーケンス化アルゴリズムと分析
4358 ワード
Javaのシーケンス化アルゴリズムと分析
シーケンス化アルゴリズムは、一般的に次のようにします.
◆オブジェクトインスタンスに関するクラスメタデータを出力します.
◆クラスのスーパークラス記述は、スーパークラスがなくなるまで再帰的に出力される.
◆クラスメタデータが完了したら、最上位のスーパークラスからオブジェクトインスタンスの実際のデータ値の出力を開始します.
◆インスタンスのデータを上から下へ再帰的に出力する
発生する可能性のあるすべての状況をより完全にカバーする別の例を説明します.
シーケンス化されたフォーマットは次のとおりです.
AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 65
73 74 05 52 81 5A AC 66 02 F6 02 00 02 49 00 07
76 65 72 73 69 6F 6E 4C 00 03 63 6F 6E 74 00 09
4C 63 6F 6E 74 61 69 6E 3B 78 72 00 06 70 61 72
65 6E 74 0E DB D2 BD 85 EE 63 7A 02 00 01 49 00
0D 70 61 72 65 6E 74 56 65 72 73 69 6F 6E 78 70
00 00 00 0A 00 00 00 42 73 72 00 07 63 6F 6E 74
61 69 6E FC BB E6 0E FB CB 60 C7 02 00 01 49 00
0E 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E 78
70 00 00 00 0B
これらのバイトが何を表しているのかよく見てみましょう.先頭、色:
AC ED: STREAM_MAGIC.はシーケンス化プロトコルを使用することを宣言する.
00 05: STREAM_VERSION.シリアル化プロトコルバージョン.
0x73: TC_OBJECT.はこれが新しいオブジェクトであることを宣言します.
シーケンス化アルゴリズムの最初のステップは、出力オブジェクト関連クラスの説明です.例に示すオブジェクトはSerialTestクラスインスタンスであるため、次にSerialTestクラスの説明を出力する.色:
0x72: TC_CLASSDESC.ここで新しいClassを開始することを宣言します.
00 0 A:Classの名前の長さ.
53,65,72,69,61 c 54,65,73,74:SerialTest,Classクラス名.
05 52 81 5 A AC 66 02 F 6:SerialVersionUID,シリアル化ID,指定がない場合はアルゴリズムによりランダムに8 byteのIDが生成する.
0 x 02:タグ番号.この値は、オブジェクトがシーケンス化をサポートしていることを宣言します.
0002:クラスに含まれるドメインの数.
次に、アルゴリズムは、int version=66のドメインの1つを出力する.色:
0 x 49:ドメインタイプ.49は「I」、すなわちIntを表す.
0007:ドメイン名の長さ.
76,672,7369 6 F 6 E:version,ドメイン名の説明.
そして、アルゴリズムは次のドメイン、contain con=new contain()を出力する.これはちょっと特殊で、対象です.オブジェクトタイプ参照の記述には、色を参照してJVMの標準オブジェクト署名表現を使用する必要があります.
0 x 4 C:ドメインのタイプ.
0003:ドメイン名の長さ.
63 F 6 E:ドメイン名の説明、con
0x74: TC_STRING.はnew String.を表し、Stringでオブジェクトを参照します.
0009:Stringの長い.
4C 63 6F 6E 74 61 69 6E 3B: Lcontain;, JVMの標準オブジェクト署名表示法
0x78: TC_ENDBLOCK DATA、オブジェクトブロック終了フラグ
.次のアルゴリズムはスーパークラス、すなわちParentクラスの説明を出力します.色を参照してください.
0x72: TC_CLASSDESC.はこれが新しいクラスであることを宣言します.
0006:クラス名の長さ.
70 61,172,65 E 74:parent、クラス名の説明.
0 E DB D 2 BD 85 EE 63 7 A:SerialVersionUID、シリアル化ID.
0 x 02:タグ番号.この値は、オブジェクトがシーケンス化をサポートすることを宣言する.
0001:クラス内のドメインの数.
次にparentクラスのドメイン記述を出力し、int parentVersion=100;同見色:
0 x 49:ドメインタイプ.49は「I」、すなわちIntを表す.
00 0 D:ドメイン名の長さ.
70 61,172,65 E 74,5665,72,73,69 6 F 6 E:parentVersion,ドメイン名説明.
0x78: TC_ENDBLOCK DATA、オブジェクトブロック終了フラグ.
0x70: TC_NULLは、他のスーパークラスのフラグがないことを示します..
これまで,アルゴリズムはすべてのクラスの記述を出力してきた.次に、インスタンスオブジェクトの実際の値を出力します.この場合はparent Classのドメインから始まります.色を参照してください.
00 00 00 00 A:10 parentVersionドメインの値.
SerialTestクラスのドメインもあります.
00 00 00 42:66,versionドメインの値.
あとのbytesは面白いですが、アルゴリズムはcontainクラスの情報を記述する必要があります.覚えておいてください.containクラスはまだ記述されていません.色を見てください.
0x73: TC_OBJECTは、これが新しいオブジェクトであることを宣言します.
0x72: TC_CLASSSDESCはここで新しいClassを開始すると宣言した.
0007:クラス名の長さ.
63 6 F 6 E 74 61,69 6 E:contain,クラス名説明.
FC BB E 6 0 E FB CB 60 C 7:SerialVersionUID,シリアル化ID.
0 x 02:Various flags.タグ番号.この値は、オブジェクトがシーケンス化をサポートすることを宣言する
0001:クラス内のドメイン数.
.containの一意のドメイン記述を出力し、int containVersion=11;
0 x 49:ドメインタイプ.49は「I」、すなわちIntを表す.
00 E:ドメイン名の長さ.
63 6 F 6 E 74 61 69 6 E 56 65,672,73,69 6 F 6 E:containVersion,ドメイン名説明.
0x78: TC_ENDBLOCK DATAオブジェクトブロックの終了フラグ.
この場合、シーケンス化アルゴリズムはcontainにスーパークラスがあるかどうかをチェックし、ある場合は出力します.
0x70:TC_NULL、スーパークラスはありません.
最後にcontainクラスの実際のドメイン値を出力します.
00 00 00 00 B:11,containVersionの値.
OK、javaシーケンス化のメカニズムと原理を議論し、学生たちに役立つことを望んでいます.
シーケンス化アルゴリズムは、一般的に次のようにします.
◆オブジェクトインスタンスに関するクラスメタデータを出力します.
◆クラスのスーパークラス記述は、スーパークラスがなくなるまで再帰的に出力される.
◆クラスメタデータが完了したら、最上位のスーパークラスからオブジェクトインスタンスの実際のデータ値の出力を開始します.
◆インスタンスのデータを上から下へ再帰的に出力する
発生する可能性のあるすべての状況をより完全にカバーする別の例を説明します.
class parent implements Serializable { int parentVersion = 10; } class contain implements Serializable{ int containVersion = 11; } public class SerialTest extends parent implements Serializable { int version = 66; contain con = new contain(); public int getVersion() { return version; } public static void main(String args[]) throws IOException { FileOutputStream fos = new FileOutputStream("temp.out"); ObjectOutputStream oos = new ObjectOutputStream(fos); SerialTest st = new SerialTest(); oos.writeObject(st); oos.flush(); oos.close(); } }
という例はかなりストレートです.SerialTestクラスはParentスーパークラスを実現し,内部にはContainerオブジェクトも持つ.シーケンス化されたフォーマットは次のとおりです.
AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 65
73 74 05 52 81 5A AC 66 02 F6 02 00 02 49 00 07
76 65 72 73 69 6F 6E 4C 00 03 63 6F 6E 74 00 09
4C 63 6F 6E 74 61 69 6E 3B 78 72 00 06 70 61 72
65 6E 74 0E DB D2 BD 85 EE 63 7A 02 00 01 49 00
0D 70 61 72 65 6E 74 56 65 72 73 69 6F 6E 78 70
00 00 00 0A 00 00 00 42 73 72 00 07 63 6F 6E 74
61 69 6E FC BB E6 0E FB CB 60 C7 02 00 01 49 00
0E 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E 78
70 00 00 00 0B
これらのバイトが何を表しているのかよく見てみましょう.先頭、色:
AC ED: STREAM_MAGIC.はシーケンス化プロトコルを使用することを宣言する.
00 05: STREAM_VERSION.シリアル化プロトコルバージョン.
0x73: TC_OBJECT.はこれが新しいオブジェクトであることを宣言します.
シーケンス化アルゴリズムの最初のステップは、出力オブジェクト関連クラスの説明です.例に示すオブジェクトはSerialTestクラスインスタンスであるため、次にSerialTestクラスの説明を出力する.色:
0x72: TC_CLASSDESC.ここで新しいClassを開始することを宣言します.
00 0 A:Classの名前の長さ.
53,65,72,69,61 c 54,65,73,74:SerialTest,Classクラス名.
05 52 81 5 A AC 66 02 F 6:SerialVersionUID,シリアル化ID,指定がない場合はアルゴリズムによりランダムに8 byteのIDが生成する.
0 x 02:タグ番号.この値は、オブジェクトがシーケンス化をサポートしていることを宣言します.
0002:クラスに含まれるドメインの数.
次に、アルゴリズムは、int version=66のドメインの1つを出力する.色:
0 x 49:ドメインタイプ.49は「I」、すなわちIntを表す.
0007:ドメイン名の長さ.
76,672,7369 6 F 6 E:version,ドメイン名の説明.
そして、アルゴリズムは次のドメイン、contain con=new contain()を出力する.これはちょっと特殊で、対象です.オブジェクトタイプ参照の記述には、色を参照してJVMの標準オブジェクト署名表現を使用する必要があります.
0 x 4 C:ドメインのタイプ.
0003:ドメイン名の長さ.
63 F 6 E:ドメイン名の説明、con
0x74: TC_STRING.はnew String.を表し、Stringでオブジェクトを参照します.
0009:Stringの長い.
4C 63 6F 6E 74 61 69 6E 3B: Lcontain;, JVMの標準オブジェクト署名表示法
0x78: TC_ENDBLOCK DATA、オブジェクトブロック終了フラグ
.次のアルゴリズムはスーパークラス、すなわちParentクラスの説明を出力します.色を参照してください.
0x72: TC_CLASSDESC.はこれが新しいクラスであることを宣言します.
0006:クラス名の長さ.
70 61,172,65 E 74:parent、クラス名の説明.
0 E DB D 2 BD 85 EE 63 7 A:SerialVersionUID、シリアル化ID.
0 x 02:タグ番号.この値は、オブジェクトがシーケンス化をサポートすることを宣言する.
0001:クラス内のドメインの数.
次にparentクラスのドメイン記述を出力し、int parentVersion=100;同見色:
0 x 49:ドメインタイプ.49は「I」、すなわちIntを表す.
00 0 D:ドメイン名の長さ.
70 61,172,65 E 74,5665,72,73,69 6 F 6 E:parentVersion,ドメイン名説明.
0x78: TC_ENDBLOCK DATA、オブジェクトブロック終了フラグ.
0x70: TC_NULLは、他のスーパークラスのフラグがないことを示します..
これまで,アルゴリズムはすべてのクラスの記述を出力してきた.次に、インスタンスオブジェクトの実際の値を出力します.この場合はparent Classのドメインから始まります.色を参照してください.
00 00 00 00 A:10 parentVersionドメインの値.
SerialTestクラスのドメインもあります.
00 00 00 42:66,versionドメインの値.
あとのbytesは面白いですが、アルゴリズムはcontainクラスの情報を記述する必要があります.覚えておいてください.containクラスはまだ記述されていません.色を見てください.
0x73: TC_OBJECTは、これが新しいオブジェクトであることを宣言します.
0x72: TC_CLASSSDESCはここで新しいClassを開始すると宣言した.
0007:クラス名の長さ.
63 6 F 6 E 74 61,69 6 E:contain,クラス名説明.
FC BB E 6 0 E FB CB 60 C 7:SerialVersionUID,シリアル化ID.
0 x 02:Various flags.タグ番号.この値は、オブジェクトがシーケンス化をサポートすることを宣言する
0001:クラス内のドメイン数.
.containの一意のドメイン記述を出力し、int containVersion=11;
0 x 49:ドメインタイプ.49は「I」、すなわちIntを表す.
00 E:ドメイン名の長さ.
63 6 F 6 E 74 61 69 6 E 56 65,672,73,69 6 F 6 E:containVersion,ドメイン名説明.
0x78: TC_ENDBLOCK DATAオブジェクトブロックの終了フラグ.
この場合、シーケンス化アルゴリズムはcontainにスーパークラスがあるかどうかをチェックし、ある場合は出力します.
0x70:TC_NULL、スーパークラスはありません.
最後にcontainクラスの実際のドメイン値を出力します.
00 00 00 00 B:11,containVersionの値.
OK、javaシーケンス化のメカニズムと原理を議論し、学生たちに役立つことを望んでいます.