Java 定制的序列化和反序列化
序列化是一种将对象的状态转换为字节流的机制。反序列化是一个相反的过程,字节流被用来在内存中重新创建实际的Java对象。这种机制被用来持久化对象。
为什么需要自定义序列化 ?
在序列化过程中,如果我们使用’transient’关键字,可能会有数据丢失。Transient “关键字被用于我们不想序列化的变量。但有时,需要以不同于默认序列化的方式对其进行序列化(如在序列化之前进行加密等),在这种情况下,我们必须使用自定义的序列化和反序列化。
下面的程序说明了上述数据丢失的情况。
输出:
在上面的例子中,在序列化之前,账户对象可以提供适当的用户名和密码,但反序列化的账户对象只提供了用户名而没有密码。这是由于将密码变量声明为暂存变量。
因此,在默认的序列化过程中,由于 transient 关键字的存在,可能会出现信息丢失的情况。为了恢复这种损失,我们必须使用 自定义序列化 。
自定义序列化可以通过以下两种方法实现。
- private void writeObject(ObjectOutputStream oos) throws Exception : 这个方法将在序列化的时候由jvm自动执行(也称为回调方法)。因此,要在序列化过程中执行任何活动,必须只在这个方法中定义。
-
private void readObject(ObjectInputStream ois) throws Exception : 这个方法将在反序列化时被jvm自动执行(也被称为Callback Methods)。因此,要在反序列化过程中执行任何活动,必须只在这个方法中定义。
注意: 在执行对象序列化时,我们必须在该类中定义上述两个方法。
输出: