保存、恢复对象状态
文章来源:《Head First Java》修炼感悟。
上两篇文章分别讨论了对象序列化和反序列化,主要是针对数据文件进行读、写操作的介绍。 本篇文章通过一个完整的例子,复习一下对象保存与恢复的操作步骤,在文章最后做了总结。
范例:保存、恢复角色数据
以下代码模拟了一个游戏角色类,在 main
方法中新建了几个角色并初始化了原始状态,然后写入数据文件再重新读取,尝试恢复到角色的原始状态。 下面是一个完整的示例:
import java.io.*;
/*** 文件:Swordsman.java* 描述:用来演示保存与读取游戏角色的例子。*/
public class Swordsman {public static void main(String[] args) {// 新建三个游戏角色Hero one = new Hero(50, "精灵", new String[] {"弓", "剑"});Hero two = new Hero(200, "侏儒", new String[] {"空手", "巨斧"});Hero three = new Hero(120, "魔法师", new String[] {"符咒", "隐身"});// 尝试写入角色数据try {FileOutputStream fs = new FileOutputStream("game.ser");ObjectOutputStream os = new ObjectOutputStream(fs);os.writeObject(one);os.writeObject(two);os.writeObject(three);os.close();} catch (IOException e) {e.printStackTrace();}// 释放堆中角色对象占用的空间one = null;two = null;three = null;// 尝试读取角色数据try {FileInputStream fs2 = new FileInputStream("game.ser");ObjectInputStream os2 = new ObjectInputStream(fs2);// 角色对象类型转换Hero heroOne = (Hero) os2.readObject();Hero heroTwo = (Hero) os2.readObject();Hero heroThree = (Hero) os2.readObject();// 输出角色信息System.out.println("角色1职业: " + heroOne.getType());System.out.println("角色2职业: " + heroTwo.getType());System.out.println("角色3职业: " + heroThree.getType());} catch (Exception ex) {ex.printStackTrace();}}
}// 角色类,为了可以序列化实现了 Serializable 接口
class Hero implements Serializable {// 角色属性int power; // 力量String type; // 职业String[] weapons; // 武器// 构造方法,用于初始化角色属性public Hero(int p, String t, String[] ws) {power = p;type = t;weapons = ws;}// 返回力量值public int getPower() {return power;}// 返回职业类型public String getType() {return type;}// 返回武器装备public String getWeapons() {String weaponList = "";for (int i = 0; i < weapons.length; i++) {weaponList += weapons[i] + " ";}return weaponList;}
}
编译、执行结果:
成功地恢复到了角色创建时的状态。
重点回顾
- 通过序列化操作可以保存对象当前状态;
- ObjectOutputStream.writeObject(obj) 可以写入对象序列化数据;
- ObjectOutputStream 连接 FileOutputStream 传递序列化数据;
- FileOutputStream 把序列化数据写入文件;
- 序列化对象必须实现 Serializable 接口,若父类已实现,子类无需重复实现;
- 对象序列化时,所有实例变量引用的对象都会被序列化;
- 如果有不能序列化的对象会抛出异常;
- 除非实例变量被修饰为
transient
,否则会被赋值 null、0、0.0 或者 false; - 反序列化时,如果 Java 虚拟机没有找到合适的类就会抛出异常;
- 从数据文件中读取对象信息时,必须与保存时的顺序一致;
- 恢复对象后的类型为 Object,需要强制转换为原始类型;
- 静态变量不会被序列化,因为它是所有对象共享的。
《 上一篇 对象反序列化 | 下一篇 写入 / 读取文本数据 》 |
---|