资料地址:http://download.oracle.com/javase/1.5.0/docs/guide/serialization/spec/input.html
private void readObjectNoData() throws ObjectStreamException;
Serializable对象反序列化时,由于序列化与反序列化提供的class版本不同,序列化的class的super class不同于序列化时的class的super class;或者收到有敌意的流;或接收不完整;都会对初始化对象字段值时造成影响。
每个Serializable class都应该定义自己的readObjectNoData方法。如果发生以上情况时,没有定义readObjectNoData方法时,类的字段就会初始化成它们的默认值(列在section 4.5.5 of The JavaTM Language Specification, Second Edition)。这种行为在版本1.4 of the JavaTM 2 SDK支持readObjectNoData方法之后是固定的。
当出现上面的情况时,readObjectNoData会取代readObject的调用。
ANY-ACCESS-MODIFIER Object readResolve()
throws ObjectStreamException;
对于Serializable and Externalizable classes,方法readResolve允许class在反序列化返回对象前替换、解析在流中读出来的对象。实现readResolve方法,一个class可以直接控制反序化返回的类型和对象引用。
方法readResolve会在ObjectInputStream已经读取一个对象并在准备返回前调用。ObjectInputStream 会检查对象的class是否定义了readResolve方法。如果定义了,将由readResolve方法指定返回的对象。返回对象的类型一定要是兼容的,否则会抛出ClassCastException 。
分享到:
相关推荐
当一个已序列化的对象被反序列化时,如果该类定义了`readResolve()`方法,那么Java会调用这个方法来代替默认的实例化过程。 在上述例子中,我们看到`MySingleton`类实现`Serializable`接口,并拥有一个静态的`...
`readResolve`方法允许开发者替换已经反序列化的对象。这在需要替换对象引用或更改其状态时非常有用。 #### 四、类描述符 **4.1 `ObjectStreamClass`类** `ObjectStreamClass`类提供了关于可序列化类的信息。它...
`readResolve()` 和 `writeReplace()` 是两个特殊的方法,可以用来自定义序列化和反序列化的行为。`readResolve()` 在反序列化时被调用,可以返回替换对象;`writeReplace()` 在序列化时被调用,可以返回一个代理...
- 使用`writeReplace()`和`readResolve()`方法可以替换序列化和反序列化时使用的对象,从而优化序列化过程。 - `Externalizable`接口提供了一种自定义序列化和反序列化方式,但需要手动编写序列化逻辑。 8. **`...
为了防止恶意反序列化,可以使用`readResolve()`或`writeReplace()`方法进行替换操作。 **六、序列化策略** 1. **默认序列化**:简单地实现Serializable接口,无需额外代码,适合字段较少且不关心序列化细节的场景...
为了解决这个问题,可以在类中添加一个`readResolve()`方法,该方法会在反序列化过程中被调用,用于返回正确的单例实例。 #### 同引用实例化问题 在序列化过程中,如果两个对象引用同一个对象实例,则在反序列化时...
Java提供了`writeReplace()`和`readResolve()`方法处理版本问题。 2. **安全性**:反序列化可能成为攻击的入口点,因为恶意数据可以构造为包含有害代码的对象。因此,必须谨慎处理反序列化的输入源,并对来自不可信...
在Java编程语言中,序列化(Serialization)是一个关键的概念,主要应用于对象的持久化存储、网络传输以及跨进程通信等场景。序列化是指将对象转换为字节流的过程,而反序列化则是将字节流恢复为原来的对象状态。`...
- `readResolve()`: 在反序列化期间,此方法允许替换返回的对象。这可以用于控制实例化逻辑,例如实现单例模式。 - `writeReplace()`: 在序列化期间,此方法允许替换要写入的对象。这通常用于优化或处理特殊类型的...
`writeReplace`方法允许在序列化前替换对象,`readResolve`方法则允许在反序列化后替换对象。 5. 总结 对象序列化是Java中一种重要的功能,它使得对象的状态能够被持久化或者在网络中传输。虽然Java提供了一套默认...
Java编程语言中,对象的创建和管理涉及到一系列...总结来说,Java对象的生命周期涉及类加载、初始化,以及对象的创建、克隆、序列化和反序列化等步骤,每一步都可能需要特定的处理和优化,以满足不同的需求和安全考虑。
对象能够被序列化,需要实现 `java.io.Serializable` 接口。任何实现了此接口的类的对象都可以被序列化。在类定义中添加 `implements Serializable` 即可: ```java public class MyClass implements Serializable ...
- 使用`writeReplace()`和`readResolve()`方法可以控制序列化和反序列化过程。 - 使用`Externalizable`接口代替`Serializable`,可以自定义序列化和反序列化逻辑。 总之,Java对象的存储与读取是通过序列化和反...
`readResolve()`方法会在反序列化时调用,返回的是单例的唯一实例,从而保证了单例的正确性。 总结起来,Java单例模式有多种实现方式,每种都有其适用场景。饿汉单例适用于对性能敏感且对延迟初始化无要求的情况;...
最后,`readResolve`和`writeReplace`方法可以用来控制序列化过程中替换的对象,这对于实现单例模式或其他高级用例非常有用。 总结来说,Java对象的存储与读取涉及到对象序列化和反序列化,通过实现`Serializable`...
为了防止恶意代码利用,Java提供了`writeReplace()`和`readResolve()`方法,允许对象在序列化和反序列化时替换自身,以增强安全性。 5. **类版本控制**:`ObjectStreamClass`维护了每个类的序列化版本ID...
5. 管理序列化生命周期:了解`readResolve()`和`writeReplace()`方法的作用,它们可以用于在序列化过程中替换或恢复对象。 6. 序列化代理模式:利用`java.lang.reflect.Proxy`实现动态代理的序列化。 7. 算法序列化...
3. 如果必须使用Java序列化,考虑实现`readResolve()`或`readObject()`方法来控制反序列化过程,确保不会执行未授权的代码。 4. 更新依赖库,确保使用的是已修复漏洞的新版本。 总结起来,Java反序列化漏洞是一个...