目次 | 前の項目 | 次の項目 Java オブジェクト直列化仕様


6.4.2 終端記号と定数

java.io.ObjectStreamConstants の次の記号は、ストリームで予期される終端値と定数値を定義したものです。

    final static short STREAM_MAGIC = (short)0xaced;
    final static short STREAM_VERSION = 5;
    final static byte TC_NULL = (byte)0x70;
    final static byte TC_REFERENCE = (byte)0x71;
    final static byte TC_CLASSDESC = (byte)0x72;
    final static byte TC_OBJECT = (byte)0x73;
    final static byte TC_STRING = (byte)0x74;
    final static byte TC_ARRAY = (byte)0x75;
    final static byte TC_CLASS = (byte)0x76;
    final static byte TC_BLOCKDATA = (byte)0x77;
    final static byte TC_ENDBLOCKDATA = (byte)0x78;
    final static byte TC_RESET = (byte)0x79;
    final static byte TC_BLOCKDATALONG = (byte)0x7A;
    final static byte TC_EXCEPTION = (byte)0x7B;
    final static byte TC_LONGSTRING = (byte) 0x7C;
    final static byte TC_PROXYCLASSDESC = (byte) 0x7D;
    final static  int   baseWireHandle = 0x7E0000;
フラグバイト classDescFlags は、次の記号の値を持つことがあります。

    final static byte SC_WRITE_METHOD = 0x01; //if SC_SERIALIZABLE
     final static byte SC_BLOCK_DATA = 0x08;    //if SC_EXTERNALIZABLE
    final static byte SC_SERIALIZABLE = 0x02;
    final static byte SC_EXTERNALIZABLE = 0x04;
ストリームを書き込んでいる Serializable クラスに writeObject メソッドがあり、それがストリームに追加データを書き込んだ可能性があると、フラグ SC_WRITE_METHOD はオンに設定されます。この場合には、そのクラスのデータは常に TC_ENDBLOCKDATA マーカで終わっていなければなりません。

STREAM_PROTOCOL_2 を使って Externalizable クラスがストリームに書き込まれる場合は、フラグ SC_BLOCKDATA が設定されます。JDKTM 1.2 のデフォルトでは、このプロトコルを使って Externalizable オブジェクトがストリームに書き込まれます。JDKTM 1.1 では、STREAM_PROTOCOL_1 を使って書き込まれます。

ストリームを書き込んだクラスが java.io.Serializable を拡張したが、java.io.Externalizable は拡張しなかった場合は、フラグ SC_SERIALIZABLE がオンに設定されます。 そのストリームを読み込むクラスもまた java.io.Serializable を拡張して、デフォルトの直列化機構を使用しなければなりません。

ストリームを書き込んだクラスが java.io.Externalizable を拡張した場合は、フラグ SC_EXTERNALIZABLE がオンに設定されます。 そのデータを読み込むクラスもまた、 Externalizable を拡張して、デフォルトの直列化機構を使用しなければなりません。 このデータはその writeExternalreadExternal メソッドを使って読み込まれます。


オリジナルクラスと、リンクリストの 2 つのインスタンスの場合を想定します。

class List implements java.io.Serializable {
    int value;
    List next;
    public static void main(String[] args) {
        try {
            List list1 = new List();
            List list2 = new List();
            list1.value = 17;
            list1.next = list2;
            list2.value = 19;
            list2.next = null;

            ByteArrayOutputStream o = new ByteArrayOutputStream();
            ObjectOutputStream out = new ObjectOutputStream(o);
            out.writeObject(list1);
            out.writeObject(list2);
            out.flush();
            ...
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
結果のストリームの内容は次のようになります。

00: ac ed 00 05 73 72 00 04 4c 69 73 74 69 c8 8a 15 >....sr..Listi...<
10: 40 16 ae 68 02 00 02 49 00 05 76 61 6c 75 65 4c >Z......I..valueL<
20: 00 04 6e 65 78 74 74 00 06 4c 4c 69 73 74 3b 78 >..nextt..LList;x<
30: 70 00 00 00 11 73 71 00 7e 00 00 00 00 00 13 70 >p....sq.‾......p<
40: 71 00 7e 00 03                                  >q.‾..<





目次 | 前の項目 | 次の項目
Copyright © 1997-2001 Sun Microsystems, Inc. All Rights Reserved.