首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Java对象序列化格式1

2012-11-20 
Java对象序列化格式一Java对象序列化时,遵循对象序列化规范。具体格式定义为:对象序列化格式定义:stream:??

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>

热点排行