Externalizable是深度定制序列化。如果同时实现了这两个接口,则只会执行Externalizable。
Serializable可以仅仅标记可序列化,使用JDK默认的序列化方法,也可以定制。实现方法:
private void writeObject(ObjectOutputStream oos) {
// oos.defaultWriteObject();
// Write/save additional fields
oos.writeUTF(value);
}
private void readObject(ObjectInputStream ois) {
// ois.defaultReadObject();
// Read/initialize additional fields
value = ois.readUTF()
}
Externalizable必须实现方法:
void writeExternal(ObjectOutput out) {
out.writeUTF(value)
}
void readExternal(ObjectInput input) {
value = input.readUTF()
}
如果实现是深度定制序列化,但是用Serializable的writeObject方法实现,它不一定起作用。
注意几点:
1、静态static成员不被序列化
2、如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException
3、transient修饰的字段不被序列化
4、父类如果不可序列化,子类不会序列化父类的成员,除非在子类中显式序列化。父类可序列化,子类也需要调用super的序列化方法。
分享到:
相关推荐
2. **自定义序列化**:通过实现Externalizable接口,自定义序列化和反序列化逻辑,适合需要优化性能或有特殊需求的场景。 3. **序列化过滤**:使用`transient`关键字忽略不想序列化的字段,或使用`@serialData`注解...
- 实现`Serializable`接口,并可选择重写`writeObject()`和`readObject()`方法来自定义序列化和反序列化逻辑。 5. **处理循环引用**: - 使用`transient`关键字标记循环引用的成员变量,或者通过重写序列化方法来...
`Externalizable`接口允许对象完全控制序列化过程,而仅实现`Serializable`接口的类则采用默认的序列化方式。对于那些不希望被序列化的类或字段,可以使用`transient`或`volatile`关键字标记,它们会被忽略在序列化...
通过这两个类,我们可以看到如何使用 Serializable 和 Externalizable 接口来实现序列化和反序列化。 序列化和反序列化的应用场景非常广泛,例如在分布式系统中,需要将对象的状态信息从一台机器传输到另一台机器上...
2. **实现Externalizable接口**:这个接口继承自`Serializable`,提供了更高级别的控制,允许开发者自己编写序列化逻辑。 3. **序列化兼容性**:`serialVersionUID`的作用在于保证版本兼容性。开发者可以通过显式...
* 使用 Externalizable 接口实现序列化和反序列化 * 使用 Java 序列化 API 实现序列化和反序列化 在实际开发中,选择合适的序列化和反序列化方法取决于具体的需求和场景。在本例中,我们使用 Serializable 接口实现...
### Java.io.Serializable 序列化...通过实现 `Serializable` 接口或 `Externalizable` 接口,可以轻松地实现序列化和反序列化功能。需要注意的是,在实际应用中还需要考虑序列化的效率、安全性以及版本兼容性等问题。
- `Externalizable`接口提供了一种自定义序列化和反序列化方式,但需要手动编写序列化逻辑。 8. **`ObjectInputStream`和`ObjectOutputStream`的其他方法:** - `defaultWriteObject()`用于写入默认的流式序列化...
2. **实现Externalizable接口**:如果需要更多控制权,可以选择实现`Externalizable`接口,该接口要求实现`writeExternal()`和`readExternal()`方法,从而可以自定义序列化和反序列化的逻辑。 #### 示例代码:序列...
总结来说,Java中的序列化和反序列化是通过`Serializable`接口和`Externalizable`接口来实现的。`Serializable`接口是默认的序列化方式,适用于大多数简单情况;而`Externalizable`接口则提供了自定义序列化行为的...
序列化也可能带来安全风险,因为任何实现了Serializable接口的对象都可以被序列化,然后在不受信任的环境中反序列化。这种攻击称为“反序列化漏洞”,可能导致代码执行。因此,谨慎处理反序列化的对象,避免来自不可...
1)Serializable和Externalizable接口Xstream框架2)Simple框架 3)Apache的AXIOM框架 2、XML验证文档的生成工具 trang.jar 3、利用XSD文件的XML3种验证方法 1)Dom4j的SAXValidator (dom4j.jar, javax.xml....
今天,我们将深入理解Java虚拟机-Java内存区域透彻分析,探讨序列化和反序列化的概念及其使用场景,实现序列化的方式,以及transient关键字的作用。 序列化和反序列化的概念 序列化是指将Java对象转换为二进制数据...
通过实现`Serializable`或`Externalizable`接口,我们可以控制对象如何被序列化和反序列化,同时`transient`关键字提供了保护敏感数据的手段。理解和熟练运用这些概念对于Java开发者来说非常重要,特别是在处理持久...
另外,还有`java.io.Externalizable`接口,它继承自`Serializable`,但提供了更细粒度的控制权,允许类自定义序列化和反序列化的行为。如果一个类实现了`Externalizable`,则需要手动实现`writeExternal...
`Serializable`接口是标识对象是否可序列化的标志,`Externalizable`接口允许更精细的控制序列化过程。 5.3 实施过程: 5.3.1 序列化:通过实现`Serializable`接口,然后使用`ObjectOutputStream`的`writeObject()`...