类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。
Java的"对象序列化"能让你将一个实现了Serializable接口的对象转换成byte流,这样日后要用这个对象时候,你就能把这些byte数据恢复出来,并据此重新构建那个对象了。
要想序列化对象,你必须先创建一个OutputStream,然后把它嵌进ObjectOutputStream。这时,你就能用writeObject()方法把对象写入OutputStream了。
writeObject()方法负责写入特定类的对象的状态,以便相应的 readObject()方法可以还原它。通过调用 out.defaultWriteObject 可以调用保存 Object 的字段的默认机制。该方法本身不需要涉及属于其超类或子类的状态。状态是通过使用 writeObject 方法或使用 DataOutput 支持的用于基本数据类型的方法将各个字段写入 ObjectOutputStream 来保存的。
读的时候,你得把InputStream嵌到ObjectInputStream里面,然后再调用readObject()方法。不过这样读出来的,只是一个Object的reference,因此在用之前,还得先下传。readObject() 方法负责从流中读取并还原类字段。它可以调用 in.defaultReadObject 来调用默认机制,以还原对象的非静态和非瞬态字段。 defaultReadObject()方法使用流中的信息来分配流中通过当前对象中相应命名字段保存的对象的字段。这用于处理类发展后需要添加新字段的情形。该方法本身不需要涉及属于其超类或子类的状态。状态是通过使用 writeObject 方法或使用 DataOutput 支持的用于基本数据类型的方法将各个字段写入 ObjectOutputStream 来保存的。
在序列化时,有几点要注意的:
1:当一个对象被序列化时,只保存对象的非静态成员变量(包括声明为private的变量),不能保存任何的成员方法和静态的成员变量。
2:如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被序列化。
3:如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException。我们可以将这个引用标记为transient,那么对象仍然可以序列化.
序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。如果接收者加载的该对象的类的 serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会导致 InvalidClassException
。可序列化类可以通过声明名为 "serialVersionUID"
的字段(该字段必须是静态 (static)、最终 (final) 的 long
型字段)显式声明其自己的 serialVersionUID:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
强烈建议:
为保证 serialVersionUID 值跨不同 java 编译器实现的一致性,序列化类必须声明一个明确的 serialVersionUID 值;
使用 private
修改器显示声明 serialVersionUID(如果可能),原因是这种声明仅应用于立即声明类 -- serialVersionUID 字段作为继承成员没有用处。
可以通过指定关键transient使对象中的某个数据元素不被还原(即不序列化该变量),这种方式常用于安全上的保护。比如对象中保存的密码。
transient 只能用在类的成员变量上,不能用在方法里.
transient 变量不能是final和static的.
分享到:
相关推荐
- 如果你需要在不同的Java平台上共享数据,那么Serializable是更好的选择,因为它遵循Java的标准序列化协议。 总结来说,Serializable和Parcelable各有优劣,选择哪种取决于具体的应用场景和性能需求。在大多数情况...
在Java中,如果一个类实现了Serializable接口,那么该类的对象就可以被序列化。序列化的目的是为了保存对象的状态以便后续使用或在网络上传输。 Hessian,由Caucho Technology开发,是一种二进制的序列化格式。相比...
### Java序列化与反序列化的深入解析 #### Java序列化的重要性及应用场景 Java序列化是一项核心功能,它允许程序员将对象的状态转化为字节流的形式,从而实现对象的持久化存储或者在网络之间进行传递。这对于诸如...
Java序列化和反序列化是Java开发中常见且重要的概念,它们主要用于对象的状态持久化以及在不同系统间传递数据。本库专注于将Java对象转换为JSON格式,这在Web服务、API开发、数据存储和传输等方面都有广泛的应用。...
### Java序列化的秘密 #### 为什么需要序列化 在探讨序列化之前,我们需要理解序列化产生的背景及其必要性。简而言之,Java程序本质上是由进程和内存构成的系统,在这个系统中,进程根据定义好的类生成一系列实例...
Java序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。相反,反序列化则是在适当的时候把这个流转换回原对象的过程。当应用程序接收来自不受信任源的数据并进行反序列化时,可能触发安全漏洞。例如,...
这个类实现了Serializable接口,确保消息能在网络间进行序列化传输。 - **代码②**:MessageType枚举类定义了消息类型的常量,例如LOGIN_MESSAGE(登录消息)和TEXT_MESSAGE(文本消息),便于在程序中识别和处理不同...
- **对象序列化**:通过实现Serializable接口,可以将Java对象转换为字节流,便于存储和网络传输。 7. **网络编程** - **Socket编程**:Java提供了Socket和ServerSocket类进行网络通信,建立TCP连接。 - **URL和...
Java提供了Serializable接口,实现了这个接口的对象可以通过ObjectOutputStream进行序列化,然后通过ObjectInputStream在另一端进行反序列化,从而实现数据的交换。 此外,为了提升用户体验,聊天器可能还会涉及到...
在Java中,我们可以使用`java.io.ObjectOutputStream`和`java.io.ObjectInputStream`进行序列化和反序列化操作。然而,如果需要将对象转换为XML格式,可以使用`javax.xml.bind.annotation.XmlRootElement`注解标记类...
本文主要讨论Android特有的序列化方式——`Parcelable`接口,以及它与Java标准序列化`Serializable`接口的区别。 `Parcelable`接口是Android框架提供的一种高效的数据序列化方式,主要用于那些需要频繁在内存、...
Java序列化是将对象的状态转换为字节流的过程,以便可以存储在磁盘上或者在网络上传输。要使一个类可序列化,你需要让该类实现`java.io.Serializable`接口。例如: ```java public class MyObject implements ...
本压缩包文件名为"jboss、weblogic、websphere等序列化漏洞检测.rar",显然关注的是针对这些服务器的特定类型安全威胁——序列化漏洞。下面将详细解释序列化漏洞的概念,它们为何危险,以及如何检测和防范。 序列化...
2. **数据序列化与反序列化**:为了持久化雇员对象,JAVA提供了`Serializable`接口。实现这个接口的对象可以通过`ObjectOutputStream`写入文件,然后通过`ObjectInputStream`读取。这样可以将对象的状态保存到磁盘并...
Java的对象永续之道,主要探讨了Java中对象的持久化技术——序列化(serialization)的原理与实践。在计算机科学中,对象的持久性是指将内存中的数据转换为持久存储形式,如硬盘上的文件,以便在系统重启后仍能保留...
- 序列化:理解序列化的作用,如何实现序列化和反序列化。 - Map:HashMap、TreeMap、LinkedHashMap的特性及其应用场景。 4. **多线程**: - 线程创建:通过Thread类和Runnable接口创建线程。 - 线程同步:...
此外,Java还提供了对象序列化(Serializable)功能,可以直接将对象写入文件并恢复。如果项目中使用了加密的文件,那么在保存时需要先解密数据,写入文件后再加密。 在压缩包文件中,"加密.jar"可能是编译后的Java...