public interface Serializable类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。
要允许不可序列化类的子类型序列化,可以假定该子类型负责保存和恢复超类型的公用 (public)、受保护的 (protected) 和(如果可访问)包 (package) 字段的状态。仅在子类型扩展的类有一个可访问的无参数构造方法来初始化该类的状态时,才可以假定子类型有此职责。如果不是这种情况,则声明一个类为可序列化类是错误的。该错误将在运行时检测到。
在反序列化过程中,将使用该类的公用或受保护的无参数构造方法初始化不可序列化类的字段。可序列化的子类必须能够访问无参数构造方法。可序列化子类的字段将从该流中恢复。
当遍历一个图形时,可能会遇到不支持 Serializable 接口的对象。在此情况下,将抛出 NotSerializableException,并将标识不可序列化对象的类。
在序列化和反序列化过程中需要特殊处理的类必须使用下列准确签名来实现特殊方法:
private void writeObject(java.io.ObjectOutputStream out)
throws IOException
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
private void readObjectNoData()
throws ObjectStreamException;
writeObject 方法负责写入特定类的对象的状态,以便相应的 readObject 方法可以恢复它。通过调用 out.defaultWriteObject 可以调用保存 Object 的字段的默认机制。该方法本身不需要涉及属于其超类或子类的状态。通过使用 writeObject 方法或使用 DataOutput 支持的用于基本数据类型的方法将各个字段写入 ObjectOutputStream,状态可以被保存。
readObject 方法负责从流中读取并恢复类字段。它可以调用 in.defaultReadObject 来调用默认机制,以恢复对象的非静态和非瞬态字段。defaultReadObject 方法使用流中的信息来分配流中通过当前对象中相应指定字段保存的对象的字段。这用于处理类演化后需要添加新字段的情形。该方法本身不需要涉及属于其超类或子类的状态。通过使用 writeObject 方法或使用 DataOutput 支持的用于基本数据类型的方法将各个字段写入 ObjectOutputStream,状态可以被保存。
在序列化流不列出给定类作为将被反序列化对象的超类的情况下,readObjectNoData 方法负责初始化特定类的对象状态。这在接收方使用的反序列化实例类的版本不同于发送方,并且接收者版本扩展的类不是发送者版本扩展的类时发生。在序列化流已经被篡改时也将发生;因此,不管源流是“敌意的”还是不完整的,readObjectNoData 方法都可以用来正确地初始化反序列化的对象。
将对象写入流时需要指定要使用的替代对象的可序列化类,应使用准确的签名来实现此特殊方法:
ANY-ACCESS-MODIFIER Object writeReplace() throws ObjectStreamException;
此 writeReplace 方法将由序列化调用,前提是如果此方法存在,而且它可以通过被序列化对象的类中定义的一个方法访问。因此,该方法可以拥有私有 (private)、受保护的 (protected) 和包私有 (package-private) 访问。子类对此方法的访问遵循 java 访问规则。
在从流中读取类的一个实例时需要指定替代的类应使用的准确签名来实现此特殊方法。
ANY-ACCESS-MODIFIER Object readResolve() throws ObjectStreamException;
此 readResolve 方法遵循与 writeReplace 相同的调用规则和访问规则。
序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。如果接收者加载的该对象的类的 serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会导致 InvalidClassException。可序列化类可以通过声明名为 "serialVersionUID" 的字段(该字段必须是静态 (static)、最终 (final) 的 long 型字段)显式声明其自己的 serialVersionUID:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
如果可序列化类未显式声明 serialVersionUID,则序列化运行时将基于该类的各个方面计算该类的默认 serialVersionUID 值,如“Java(TM) 对象序列化规范”中所述。不过,强烈建议 所有可序列化类都显式声明 serialVersionUID 值,原因是计算默认的 serialVersionUID 对类的详细信息具有较高的敏感性,根据编译器实现的不同可能千差万别,这样在反序列化过程中可能会导致意外的 InvalidClassException。因此,为保证 serialVersionUID 值跨不同 java 编译器实现的一致性,序列化类必须声明一个明确的 serialVersionUID 值。还强烈建议使用 private 修饰符显示声明 serialVersionUID(如果可能),原因是这种声明仅应用于直接声明类 -- serialVersionUID 字段作为继承成员没有用处。数组类不能声明一个明确的 serialVersionUID,因此它们总是具有默认的计算值,但是数组类没有匹配 serialVersionUID 值的要求。
分享到:
相关推荐
javax.sql.rowset.serial 提供实用工具类,允许 SQL 类型与 Java 编程语言数据类型之间的可序列化映射关系。 javax.sql.rowset.spi 第三方供应商在其同步提供者的实现中必须使用的标准类和接口。 javax.swing 提供...
6. **代码实现**:在实际开发中,开发者需要了解如何在Java代码中导入和使用Phprpc.jar,以及如何调用其提供的API来解析PHP序列化的字符串。这可能涉及到类的实例化、方法调用等Java编程基础知识。 7. **性能优化**...
10. **Format**(format.html):格式类用于解析和序列化地理空间数据,支持多种格式如GML、GeoJSON、KML等。开发者可以使用这些格式类读取外部数据源,或将地图上的数据导出为不同格式。 总的来说,OpenLayers通过...
Serializable接口则用于对象的序列化和反序列化。 2. **集合框架**:包括List、Set、Map等接口以及ArrayList、LinkedList、HashSet、HashMap等实现类。它们提供了数据存储和操作的各种方式,如添加、删除、查找和...
本中文API文档将帮助开发者深入理解并有效利用JqGrid的各项功能。 一、基本使用 JqGrid的使用始于HTML页面中的表格元素,通过设置`<table>`标签的`id`属性,JqGrid会绑定到这个表格。例如: ```html ...
7. **JAF(JavaBeans Activation Framework)**:用于处理数据对象的激活和序列化。 8. **JPA(Java Persistence API)**:为对象/关系映射提供了标准接口,简化了数据库访问。 **使用前必看.txt** 这个文件可能...
torch模块涵盖了基础的张量操作,例如索引、切片、连接和换位操作,张量的创建和操作,如随机抽样和序列化,以及张量的数学运算、累积操作和其他操作。这部分文档还涉及了torchvision模块,该模块主要用于计算机视觉...
消息格式描述了Kafka数据的存储格式,这对于开发者理解如何在不同语言中序列化和反序列化数据非常重要。 日志分布部分会介绍如何管理和维护Kafka集群中的数据分布,包括分区、副本分配、首领选举等。 操作部分介绍...
7. **JAF(JavaBeans Activation Framework)**:JAF是Java对象激活和序列化的框架,它允许开发者创建和操作数据对象,而无需了解对象的内部实现。 8. **JPA(Java Persistence API)**:JPA是ORM(Object-...
javax.sql.rowset.serial 提供实用工具类,允许 SQL 类型与 Java 编程语言数据类型之间的可序列化映射关系。 javax.sql.rowset.spi 第三方供应商在其同步提供者的实现中必须使用的标准类和接口。 javax.swing 提供一...
综上所述,Pandas中文API文档覆盖了从数据导入、清洗、处理到分析和可视化的全面知识,是学习和精通Python数据科学不可或缺的资源。通过深入阅读和实践,你将能够高效地驾驭数据,从而在数据分析领域游刃有余。
Stream API提供了对大量数据进行并行处理的能力,支持序列化和并行化操作,如过滤、映射、减少等,使得对集合的复杂操作变得简洁高效。 #### 新日期时间API 在`java.time`包下,JDK 1.8引入了新的日期和时间API,...
Java API涵盖了众多模块,包括基础类库、集合框架、网络编程、多线程、I/O流、反射、异常处理、国际化、日期时间、XML处理、数据库连接等。以下是一些关键的知识点: 1. **基础类库**:包括Object、String、Math、...
中文版的Java API文档为中文环境下的开发者提供了极大的便利,避免了语言障碍,使得学习和理解Java API更为高效。下面将详细阐述Java API的主要组成部分及其重要知识点。 1. **基础类与接口** - **Object类**:...
这是Java强大之处,常用于插件系统、序列化和动态代理。 9. **泛型** 泛型引入于Java 5,增强了类型安全,允许在类、接口和方法中使用类型参数,限制了不兼容类型的对象插入集合。 10. **Lambda表达式** Java 8...
13. **资源序列化**:Unity的自动序列化机制,使得游戏数据可以在不同场景之间保存和加载。 14. **插件和扩展**:Unity社区提供了大量的第三方插件和扩展,API手册也会介绍如何集成和使用它们。 通过"Unity5圣典...
4. **资源管理**:包括资源加载、预加载、序列化和反序列化等,这些都是优化游戏性能和用户体验的关键。 5. **输入系统**:涵盖键盘、鼠标、触摸屏和其他控制器的输入管理,允许开发者创建高度交互的游戏体验。 6....
此外,`java.util.Stream` API的引入提供了高效的数据处理能力,支持序列化计算和并行处理,使得对大量数据的操作变得更加便捷。 在日期和时间API上,Java 8引入了`java.time`包,替代了旧有的`java.util.Date`和`...
例如,FileInputStream和FileOutputStream用于文件操作,ObjectInputStream和ObjectOutputStream支持对象的序列化和反序列化。 4. **集合框架**:Java 1.6.0引入了丰富的集合接口和实现,如List、Set、Map等,以及...