Serializable是二进制位为基础保存的,可以没有任何构造方法。
Externalizable必须要手动提供一个public no-arg构造方法,否则会报错!
transient表示变量不被序列化,但是如果一个类实现Externalizable在writeObject()仍然把transient变量序列了,是可以成功的。这就失去了transient的意义!
实现Serializable也可以自定义序列化。
要有
private void writeObject(ObjectOutputStream stream) throws IOException;
private void readObject(ObjectInputStream stream)throws IOException, ClassNotFoundException
这两个方法,其中这两个方法分别是在ObjectOutputStream和ObjectInputStream中被调用,且是同名方法,在ObjectOutputStream和ObjectInputStream中还有defaultWriteObject和defaultReadObject两个方法用于对非transient变量的序列化与反序列化。
还有一种特殊的情况:序列化单例和类型安全的枚举。
在jdk5.0以前,Enum还未出现,这时一个类中会有私有构造方法来创建多个枚举值,如下
public class Orientation implements Serializable{
private int value ;
private Orientation(int i){
value = i;
}
public static final Orientation HORIZONTAL = new Orientation(1);
public static final Orignetation VERTICAL = new Orientation(2);
}
构造器是私有的,那么在这个类外就不可能会出现除HORIZONTAL和 VERTICAL的其它枚举值,因此可以用==来进行比较 ,但是在序列化和反序列化(即使构造器是私有的也可以反序列化),那么反序列化后的value和原先的HORIZONTAL和VERTICAL不能再用==比较了,因此这里就会有问题。
这时就需要再用一个方法 protected Object readResolve() throws ObjectStreamException{
if(value == 1){
return Orientation.HORIZONTAL;
}
if(value == 2){
return Orientation.VERTICAL;
}
return null;// this should not happen
}
在readObject()后面调用,将反序列化后的对象用另一个对象替换。还有一个writeReplace()方法是在writeObject()前调用,将一个对象替换成另一个对象进行序列化。
分享到:
相关推荐
在 serializable-prj 项目中,可能包含了各种示例代码,展示了如何在Java中实现和使用序列化功能。 综上所述,Java的序列化和外部化是实现对象持久化和跨进程通信的关键技术。理解并熟练掌握这些概念,能够帮助...
在 Java 中,序列化和反序列化是通过实现 Serializable 接口来实现的。Serializable 接口是一个标记接口,不包含任何方法,但它告诉 Java虚拟机(JVM)该类可以被序列化。 在上面的代码中,我们可以看到 ...
Java序列化(Serializable)是Java平台提供的一种持久化机制,允许将对象的状态转换为字节流,以便存储到磁盘、数据库中,或者在网络上传输。这一过程被称为对象的序列化。反之,将字节流恢复为原来的对象状态称为反...
### Java序列化(Serializable)与反序列化详解 #### 序列化概念与应用场景 序列化是指将程序中的对象转换为一系列字节序列的过程,主要用于保存对象的状态以便将来使用或者在网络之间传输对象。Java提供了内置的...
### Java.io.Serializable 序列化...通过实现 `Serializable` 接口或 `Externalizable` 接口,可以轻松地实现序列化和反序列化功能。需要注意的是,在实际应用中还需要考虑序列化的效率、安全性以及版本兼容性等问题。
通过实现`Serializable`或`Externalizable`接口,我们可以控制对象如何被序列化和反序列化,同时`transient`关键字提供了保护敏感数据的手段。理解和熟练运用这些概念对于Java开发者来说非常重要,特别是在处理持久...
### Java对象序列化标准知识点详解 #### 一、系统架构概览 **1.1 概览** Java 对象序列化是一种将Java对象的...以上内容涵盖了Java序列化标准的关键知识点,深入了解这些概念有助于更好地理解和应用Java序列化技术。
在这种情况下,可以考虑使用`writeObject()`和`readObject()`方法来自定义序列化行为,或者使用`Externalizable`接口,它比`Serializable`提供了更多的控制。 6. **序列化框架**:除了Java内置的序列化机制,还有...
Java序列化和反序列化是Java平台中的核心特性,允许对象在各种上下文中持久化和传输。虽然它提供了许多便利,但同时也需要注意安全性问题和性能优化。在实际开发中,根据需求选择合适的序列化策略和工具是至关重要的...
总结来说,Java中的序列化和反序列化是通过`Serializable`接口和`Externalizable`接口来实现的。`Serializable`接口是默认的序列化方式,适用于大多数简单情况;而`Externalizable`接口则提供了自定义序列化行为的...
- **Externalizable**:继承自Serializable接口,提供更细粒度的控制,允许开发者自定义序列化和反序列化的行为。 4. **序列化和反序列化步骤** - **序列化**: - 创建`ObjectOutputStream`,可以传入一个其他...
2. **实现Externalizable接口**:如果需要更多控制权,可以选择实现`Externalizable`接口,该接口要求实现`writeExternal()`和`readExternal()`方法,从而可以自定义序列化和反序列化的逻辑。 #### 示例代码:序列...
Java序列化主要有两种方式:隐式序列化(实现Serializable接口)和显式序列化(实现Externalizable接口)。 ### 隐式序列化 **实现Serializable接口**:这是最常见也是最简单的一种序列化方式。只要一个类实现了`...
Java文件序列化是Java平台中一种重要的数据存储和交换机制,它允许我们将对象的状态转换为字节流,以便可以保存到磁盘、网络传输或在内存中存储,然后在需要时将这些字节流恢复为原来的对象。这个过程称为序列化...
另外,还有`java.io.Externalizable`接口,它继承自`Serializable`,但提供了更细粒度的控制权,允许类自定义序列化和反序列化的行为。如果一个类实现了`Externalizable`,则需要手动实现`writeExternal...
- `Externalizable`接口提供了一种自定义序列化和反序列化方式,但需要手动编写序列化逻辑。 8. **`ObjectInputStream`和`ObjectOutputStream`的其他方法:** - `defaultWriteObject()`用于写入默认的流式序列化...
Java中的序列化机制有两种实现方式: 一种是实现Serializable接口 另一种是实现Externalizable接口 区别: 实现Serializable接口 1 系统自动储存必要的信息 2 Java内建支持,易于实现,只需实现该接口即可,无须任何...
Java对象的序列化是Java平台提供的一种持久化机制,它允许将对象的状态转换为字节流,以便存储在...理解序列化的原理以及如何正确使用`Serializable`和`Externalizable`接口,对于开发高质量的Java应用程序至关重要。