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 &amp; classDescFlag &amp;&amp;
???? // !(SC_WRITE_METHOD &amp; classDescFlags)
?? wrclass objectAnnotation // SC_SERIALIZABLE &amp; classDescFlag &amp;&amp;
???? // SC_WRITE_METHOD &amp; classDescFlags
?? externalContents // SC_EXTERNALIZABLE &amp; classDescFlag &amp;&amp;
???? // !(SC_BLOCKDATA &amp; classDescFlags
?? objectAnnotation // SC_EXTERNALIZABLE &amp; classDescFlag&amp;&amp;
???? // SC_BLOCKDATA &amp; 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>