一、前言
复习Java基础知识点的序列化与反序列化过程,整理了如下学习笔记。
二、为什么需要序列化与反序列化
程序运行时,只要需要,对象可以一直存在,并且我们可以随时访问对象的一些状态信息,如果程序终止,那么对象是肯定不会存在的,但是有时候,我们需要再程序终止时保存对象的状态信息,之后程序再次运行时可以重新恢复到之前的状态,如,玩家玩游戏退出时,需要保存玩家的状态信息(如等级、装备等等),之后玩家再此登入时,必须要恢复这些状态信息。我们可以通过数据库手段来达到这个保存状态的目的,在Java中,我们有更简便的方法进行处理,那就是序列化与反序列化。序列化是一种对象持久化的手段,反序列化与序列化相反,其是通过序列化后的信息重新组装成对象。序列化与反序列化普遍应用在网络传输、RMI等场景中。
三、序列化概述
3.1 序列化类结构图
下面展示了与序列化相关的类的结构图
说明:虚线框的表示接口类型,实线框表示具体的类。
3.2 序列化关键字说明
与序列化相关的关键字如下
说明:
1. 关键字transient,用来修饰字段,表示此字段在默认序列化过程中不会被处理,但是可以采用另外的手段进行处理。
2. 关键字serialVersionUID,表示序列化版本号,当两个类的序列化ID一致时允许反序列化,默认可以采用编译器提供的值1L。
3.3 序列化方法说明
与序列化相关的方法如下
说明:writeObject与readObject方法分别在ObjectOutput接口与ObjectInput接口中声明,在ObjectOutputStream与ObjectInputStream中实现。
四、Serializable
4.1 Serializable定义
Serializable定义如下
public interface Serializable { }
说明:Serializable为一个接口,并且没有任何字段和方法,仅仅作为一个标识。
4.2 使用说明
当序列化对象时,只需要将对象标记为可序列化,即实现接口Serializable即可。下面的Person类实现了Serializable接口。
package com.hust.grid.leesf.serializable; import java.io.Serializable; public class Person implements Serializable { /** * */ private static final long serialVersionUID = 1L; private String name; private String gender; private int age; private transient Person friend; public Person() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Person getFriend() { return friend; } public void setFriend(Person friend) { this.friend = friend; } @Override public String toString() { return "name = " + name + ", gender = " + gender + ", age = " + age + ", friend info is [" + friend + "]"; } }