`
liugang594
  • 浏览: 985897 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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对象序列化和反序列化工具Xson.zip

    Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven:  <groupId>com.github.xsonorg</groupId>  <artifactId>xson-core  <version>1.0.1 ...

    Java对象序列化标准最新版

    ### Java对象序列化标准知识点详解 #### 一、系统架构概览 **1.1 概览** Java 对象序列化是一种将Java对象的状态转换成字节流的过程,以便于在网络上传输或存储到磁盘上。Java序列化标准定义了一套规则来描述如何...

    java 对象序列化

    Java对象序列化是一种将Java对象转换为字节流的过程,以便可以存储在磁盘上、在网络上传输或在任何其他需要持久化数据的场景中使用。这个过程涉及到两个主要概念:序列化(Marshalling)和反序列化(Unmarshalling)...

    java对象序列化和反序列化

    **一、Java对象序列化** 1. **定义**: Java对象序列化是将Java对象转换为字节流的过程,以便可以存储在磁盘上或在网络上传输。它允许我们将对象的状态保存下来,即使程序关闭,下次启动时也能恢复到之前的状态。 2...

    关于 Java 对象序列化您不知道的 5 件事

    Java对象序列化是Java平台的一项重要特性,它允许将对象的状态转换为字节流,以便存储、传输或恢复。在本文中,我们将深入探讨关于Java对象序列化你可能不知道的五件事情,这些知识点对于理解和优化你的Java应用程序...

    java 对象的序列化与反序列化

    Java对象的序列化和反序列化是Java编程中一项重要的技术,主要用于将对象的状态转换为字节流,以便存储或在网络上传输。这一过程对于理解Java的IO操作、持久化数据以及实现分布式通信等场景非常关键。 首先,我们来...

    JAVA对象序列化保存为XML文件的工具类

    以下是一个简单的示例,展示了如何使用`ObjectToXMLUtil`工具类将Java对象序列化到XML文件以及从XML文件中反序列化: ```java public class Test { public static void main(String[] args) { // 创建一个示例...

    java对象序列化.ppt

    Java对象序列化是一种将对象转换为字节流的过程,以便可以将其存储在磁盘上,或者在网络中进行传输。这是Java平台提供的一种功能,允许程序员将任何Java对象持久化,即将其状态保存到磁盘,或者在网络中进行传输。...

    java序列化对象传给php

    android(包括java)序列化一个对象传给php去做处理,或是接到php的序列化的对象在java中做处理的工具jar包以及使用方法. 使用方法: byte[] b = null; b = PHPSerializer.serialize(一个对象);//将一个对象序列化后返回...

    Java对象序列化的秘密

    Java对象序列化是Java平台提供的一种机制,允许将对象的状态转换为字节流,以便存储在磁盘上、通过网络传输或在不同时间点恢复。这个过程涉及到将一个复杂的Java对象模型转换为简单的二进制表示,使得数据可以在不同...

    介绍Java对象序列化使用基础

    序列化的过程就是对象写入字节流和从字节流中读取对象。...对象序列化功能非常简单、强大,在RMI、Socket、JMS、EJB都有应用。对象序列化问题在网络编程中并不是最激动人心的课题,但却相当重要,具有许多实用意义。

    java对象序列化 传输 保存

    Java对象序列化是一种将Java对象转换为字节流的过程,以便可以存储这些对象或通过网络进行传输。这个过程是Java平台的核心特性,它允许开发者将复杂的对象结构持久化或者在网络间进行安全通信。序列化不仅可以用于...

    java反序列化工具

    Java反序列化是一种将已序列化的对象状态转换回对象的过程,它是Java平台中持久化数据的一种常见方式。在Java应用程序中,序列化用于保存对象的状态以便稍后恢复,或者在网络间传输对象。然而,这个过程也可能引入...

    java 序列化成PHP格式。

    将java数据 序列化成PHP的格式 a:4:{s:6:"title2";s:13:"这是标题2";s:6:"title3";s:13:"这是标题3";s:5:"title";s:13:"这是标题1";s:6:"title4";s:13:"这是标题4";} 或者a:1:{i:0;a:1:{s:4:"name";s:10:"这是1321";...

    java您所不知道的五件事--java对象序列化

    Java对象序列化是Java平台的一项重要特性,自JDK 1.1开始引入。它允许开发者将Java对象的状态转换为字节数组,方便存储、持久化或在网络间传输。之后,这些字节数组可以恢复成原来的Java对象,保持其状态不变。这一...

    java序列化和反序列化的方法

    Java 序列化和反序列化是 Java 语言中的一种机制,用于将对象转换为字节流,以便在网络上传输或存储。序列化是将对象转换为字节流的过程,而反序列化是将字节流转换回对象的过程。 在 Java 中,序列化和反序列化是...

    Java对象序列化

    ### Java对象序列化详解 #### 一、Java对象序列化概念 Java对象序列化是指将...理解序列化文件的格式以及序列化过程中的关键步骤,有助于开发者更好地掌握Java对象序列化的细节,并能够在实践中有效地应用这些知识。

    C#和Java的序列化反序列化

    总结来说,C#和Java的序列化和反序列化机制都是各自语言中不可或缺的一部分,它们使得数据能够在不同环境之间自由流动。理解和掌握这些技术对于任何软件开发者来说都是非常重要的,特别是涉及到数据持久化、网络通信...

Global site tag (gtag.js) - Google Analytics