Javaのシーケンス化アルゴリズムと分析


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シーケンス化のメカニズムと原理を議論し、学生たちに役立つことを望んでいます.