序列化作用:
1、存储对象
如果只有自己写的Java程序会用到这些数据:
(1)用序列化(serialization)
将被序列化的对象写到文件中,然后就可以让你的程序去文件中读取序列化的对象并把它们展开回到活生生的状态
如果数据需要被其他程序引用:
(2)写一个纯文本文件,用其它程序可以解析的特殊字符写到文件中。例如写成tab字符分割的档案以便让电子表格或数据库应用程序使用。
2、存储状态
假设你有个程序,是个幻想冒险游戏,要过很多关才能完成。在游戏进行过程中,游戏的人物会累积经验值、宝物、体力等。你不会想让游戏每次重新启动都要从头来过----这样根本没人玩。因此你需要一种方法来保存人物的状态,并且在重新开启时能够恢复到上次存储时的原状。
将序列化对象写入文件
(1)创建出FileOutputStream,如果MyGame.ser文件不存在,它会自动被创建出来,
创建存取文件的FileOutputStream对象
FileOutputStream fileStream = new FileOutputStream("MyGame.ser");
(2)创建ObjectOutputStream,,,,fileStream能让你写入对象,但无法直接的连接文件,所以需要参数指引
ObjectOutputStream os = new ObjectOutputStream(fileStream);
(3)写入对象,将变量所引用的对象序列化并写入MyGame.ser这个文件
os.writeObject(characterOne);
os.writeObject(characterTwo);
os.writeObject(characterThree);
(4)关闭ObjectOutputStream,,关闭所关联输出串流
os.close();
如果要让类能够被序列化,就要实现Serializable
package com.swing;
import java.io.*;
public class Box implements Serializable { //没有方法需要被实现,只是用来告诉Java虚拟机它可以被序列化
private int width; //这个值会被保存
private int height; //这个值会被保存
public void setWidth(int w) {
width = w;
}
public void setHeight(int h) {
height = h;
}
public static void main(String[] args) {
Box myBox = new Box();
myBox.setWidth(50);
myBox.setHeight(20);
try {
FileOutputStream fs = new FileOutputStream("foo.ser");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(myBox);
os.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
当某个实例变量不能或不应该被序列化,就把它标记为transient(顺时)的。
例如:
transient String currentID;
String userName;
解序列化(Deserialization):还原对象
(1)创建FileInputStream
FileInputStream fileStream = new FileInputStream("foo.ser"); //如果文件不存在就会抛出异常
(2)创建ObectInputStream
ObjectInputStream os = new ObjectInputStream(fileStream); //读取文件对象,但是要靠连接的stream提供的文件存取
(3)读取对象
Object one = os.readObject(); //每次调用readObject()都会从stream中读出下一个对象,读取顺序与写入顺序相同,次数超过会抛出异常
Object two = os.readObject();
Object three = os.readObject();
(4)转换对象类型
GameCharacter elf = (GameCharacter)one; //返回值是object类型,因此必须要转换类型
GameCharacter troll = (GameCharacter)two;
GameCharacter magician = (GameCharacter)three;
(5)关闭ObjectInputStream
os.close(); //FileInputStream会自动跟着关掉
关注公众号:工控技术之家,可留言提问相关问题,有需要可发送源代码