CONTENTS | PREV | NEXT | Java Object Serialization Specification |
The following symbols injava.io.ObjectStreamConstants
define the terminal and constant values expected in a stream.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;The flag byte classDescFlags may include values offinal 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;The flag SC_WRITE_METHOD is set if the Serializable class writing the stream had awriteObject
method that may have written additional data to the stream. In this case a TC_ENDBLOCKDATA marker is always expected to terminate the data for that class.The flag SC_BLOCKDATA is set if the
Externalizable
class is written into the stream usingSTREAM_PROTOCOL_2
. By default, this is the protocol used to writeExternalizable
objects into the stream in JDKTM 1.2. JDKTM 1.1 writes STREAM_PROTOCOL_1.The flag SC_SERIALIZABLE is set if the class that wrote the stream extended
java.io.Serializable
but notjava.io.Externalizable
, the class reading the stream must also extendjava.io.Serializable
and the default serialization mechanism is to be used.The flag SC_EXTERNALIZABLE is set if the class that wrote the stream extended
java.io.Externalizable
, the class reading the data must also extendExternalizable
and the data will be read using itswriteExternal
andreadExternal
methods.
Consider the case of an original class and two instances in a linked list: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(); } } }The resulting stream contains: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.~..<