Java对象序列化格式一

Java对象序列化时,遵循对象序列化规范。

具体格式定义为:
对象序列化格式定义:

stream:
   magic version contents

contents:
   content
   contents content

content:
   object
   blockdata

object:
   newObject
   newClass
   newArray
   newString
   newClassDesc
   prevObject
   nullReference
   exception
   TC_RESET

newClass:
   TC_CLASS classDesc newHandle

classDesc:
   newClassDesc
   nullReference
   (ClassDesc)prevObject // an object required to be of type ClassDesc

superClassDesc:
   classDesc

newClassDesc:
   TC_CLASSDESC className serialVersionUID newHandle classDescInfo
   TC_PROXYCLASSDESC newHandle proxyClassDescInfo

classDescInfo:
   classDescFlags fields classAnnotation superClassDesc

className:
   (utf)

serialVersionUID:
   (long)

classDescFlags:
   (byte) // Defined in Terminal Symbols and Constants

proxyClassDescInfo:
   (int)<count> proxyInterfaceName[count] classAnnotation
   superClassDesc

proxyInterfaceName:
   (utf)

fields:
   (short)<count> fieldDesc[count]

fieldDesc:
    primitiveDesc
    objectDesc

primitiveDesc:
    prim_typecode fieldname

objectDesc:
    obj_typecode fieldName className1

fieldName:
    (utf)

className1:
    (String)object // String containing the field’s type,
    // in field descriptor format

classAnnotation:
    endBlockData
    contents endBlockData // contents written by annotateClass

prim_typecode:
   ‘B’ // byte
   ‘C’ // char
   ‘D’ // double
   ‘F’ // float
   ‘I’ // integer
   ‘J’ // long
   ‘S’ // short
   ‘Z’ // Boolean

obj_typecode:
   ‘[‘ // array
   ‘L’ // object

newArray:
   TC_ARRAY classDesc newHandle (int)<size> values[size]

newObject:
   TC_OBJECT classDesc newHandle classdata[] // data for each class

classdata:
   nowrclass // SC_SERIALIZABLE & classDescFlag &&
     // !(SC_WRITE_METHOD & classDescFlags)
   wrclass objectAnnotation // SC_SERIALIZABLE & classDescFlag &&
     // SC_WRITE_METHOD & classDescFlags
   externalContents // SC_EXTERNALIZABLE & classDescFlag &&
     // !(SC_BLOCKDATA & classDescFlags
   objectAnnotation // SC_EXTERNALIZABLE & classDescFlag&&
     // SC_BLOCKDATA & classDescFlags

nowrclass:
   values // fields in order of class descriptor

wrclass:
   nowrclass

objectAnnotation:
   endBlockData
   contents endBlockData // contents written by writeObject
   // or writeExternal PROTOCOL_VERSION_2.

blockdata:
   blockdatashort
   blockdatalong

blockdatashort:
   TC_BLOCKDATA (unsigned byte)<size> (byte)[size]

blockdatalong:
   TC_BLOCKDATALONG (int)<size> (byte)[size]

endBlockData:
   TC_ENDBLOCKDATA

externalContent: // Only parseable by readExternal
   ( bytes) // primitive data
   object

externalContents: // externalContent written by
   externalContent // writeExternal in PROTOCOL_VERSION_1.
   externalContents externalContent

newString:
   TC_STRING newHandle (utf)
   TC_LONGSTRING newHandle (long-utf)

prevObject:
   TC_REFERENCE (int)handle

nullReference:
   TC_NULL

exception:
   TC_EXCEPTION reset (Throwable)object reset

magic:
   STREAM_MAGIC

version:
   STREAM_VERSION

values: // The size and types are described by the
    // classDesc for the current object

newHandle: // The next number in sequence is assigned
      // to the object being serialized or deserialized

reset: // The set of known objects is discarded
    // so the objects of the exception do not
    // overlap with the previously sent objects
    // or with objects that may be sent after
    // the exception

其中大写字符串是一些定义好的常量或终结符,有以下几个:

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;
</size></size></size></count></count>

你可能感兴趣的:(java,F#,J#)