Java对象序列化与反序列化规范详解

需积分: 9 1 下载量 161 浏览量 更新于2024-08-01 收藏 349KB PDF 举报
"serial-spec[1].pdf 是一份关于Java对象序列化和反序列化的规范文档,主要面向中高级开发人员,旨在详细阐述如何在Java系统中将对象转化为可存储或传输的序列化形式,以及如何从序列化数据恢复原始对象。此文档还讨论了不同版本的类如何能够读写兼容的序列化流,确保版本间的兼容性。" Java对象序列化是Java平台提供的一种机制,允许将对象的状态转换为字节流,以便于存储到磁盘、持久化到数据库,或者在网络间进行传输。这个过程不仅包含了对象的实例字段值,还包含了足够的类型信息,使得在任何支持Java的环境中都能重新创建出等价的对象。 反序列化则是序列化的逆过程,它从字节流中恢复出原始的对象结构。重要的是,Java序列化机制设计了版本兼容性,即使类的版本发生了变化,只要遵循一定的规则,旧版本的代码依然可以正确地读取由新版本代码写出的序列化流。 文档中的"Revision 1.4.4"表明这是该规范的一个特定修订版,版权归属于Sun Microsystems(现为Oracle Corporation的一部分),并提供了对实现该规范的许可条件。根据描述,Sun Microsystems授予用户一个无须额外付费、非排他性的、不可转让的、永久的、全球范围内的有限许可证,但不包括转授权的权利,并且仅限于创建和分发基于当前版本规范的“清洁室”实现。这里的“清洁室实现”通常指的是不参考源代码,而是独立实现规范所描述的功能。 Java序列化涉及的关键概念和组件包括: 1. `Serializable`接口:要序列化的类必须实现此接口,表明它们支持序列化。 2. `ObjectOutputStream`:用于写入序列化对象的输出流,它处理将Java对象转换为字节流的工作。 3. `ObjectInputStream`:用于从字节流中恢复对象的输入流,执行反序列化操作。 4. `writeObject()`和`readObject()`方法:这两个方法分别用于序列化和反序列化自定义类型的对象,允许开发者控制序列化过程。 5. `serialVersionUID`:每个可序列化类都有一个唯一的`serialVersionUID`,用于版本控制,防止因为类的修改导致序列化兼容性问题。 此外,文档可能还会涵盖序列化过程中的优化技巧,如标记为transient或static的字段不会被序列化,以及如何处理复杂的对象图(包括循环引用)等高级主题。对于中高级开发人员来说,深入理解这份规范有助于编写更高效、更安全的序列化和反序列化代码。

void SerialApp_ProcessMSGCmd( afIncomingMSGPacket_t *pkt ){ uint8 stat; uint8 seqnb; uint8 delay; switch ( pkt->clusterId ) { // A message with a serial data block to be transmitted on the serial port. case SERIALAPP_CLUSTERID1: // Store the address for sending and retrying. osal_memcpy(&SerialApp_RxAddr, &(pkt->srcAddr), sizeof( afAddrType_t )); seqnb = pkt->cmd.Data[0]; // Keep message if not a repeat packet if ( (seqnb > SerialApp_RxSeq) || // Normal ((seqnb < 0x80 ) && ( SerialApp_RxSeq > 0x80)) ) // Wrap-around { // Transmit the data on the serial port. if ( HalUARTWrite( SERIAL_APP_PORT, pkt->cmd.Data+1, (pkt->cmd.DataLength-1) ) ) { // Save for next incoming message SerialApp_RxSeq = seqnb; stat = OTA_SUCCESS; } else { stat = OTA_SER_BUSY; } } else { stat = OTA_DUP_MSG; } // Select approproiate OTA flow-control delay. delay = (stat == OTA_SER_BUSY) ? SERIALAPP_NAK_DELAY : SERIALAPP_ACK_DELAY; // Build & send OTA response message. SerialApp_RspBuf[0] = stat; SerialApp_RspBuf[1] = seqnb; SerialApp_RspBuf[2] = LO_UINT16( delay ); SerialApp_RspBuf[3] = HI_UINT16( delay ); osal_set_event( SerialApp_TaskID, SERIALAPP_RESP_EVT ); osal_stop_timerEx(SerialApp_TaskID, SERIALAPP_RESP_EVT); break; // A response to a received serial data block. case SERIALAPP_CLUSTERID2: if ((pkt->cmd.Data[1] == SerialApp_TxSeq) && ((pkt->cmd.Data[0] == OTA_SUCCESS) || (pkt->cmd.Data[0] == OTA_DUP_MSG))) { SerialApp_TxLen = 0; osal_stop_timerEx(SerialApp_TaskID, SERIALAPP_SEND_EVT); } else { // Re-start timeout according to delay sent from other device. delay = BUILD_UINT16( pkt->cmd.Data[2], pkt->cmd.Data[3] ); osal_start_timerEx( SerialApp_TaskID, SERIALAPP_SEND_EVT, delay ); } break; case SERIALAPP_CONNECTREQ_CLUSTER: SerialApp_ConnectReqProcess((uint8*)pkt->cmd.Data); case SERIALAPP_CONNECTRSP_CLUSTER: SerialApp_DeviceConnectRsp((uint8*)pkt->cmd.Data); default: break; }}每行代码注释

2023-06-06 上传