①序列化对象写入文件(Serializaiton):
对象序列化之前,它的类要被声明为Serializable(实现 Serializable 的接口):
public class aa implements Serializable{
private int c;
public void getC(){
return c;
}
import java.io.*
FileOutpurStream fs=new FileOutputStream("aaaa.ser");
//如果文件不存在,会被在当前目录创建
//这里可以是相对路径,也可以是绝对路径 如C://user/xiaojing/desktop/xiaojing.txt ,注意斜杠的方向与系统默认的不同,不然无法解析
ObjectOutputStream os=new ObjectOutputStream(fs);
//两个输出流相连接,共同作用
//ObjectOutStream把对象写成串流
//FileOutputStream把对象写成的串流编译成字节码
os.writeObject(a);
//a 是一个对象
//将a序列化并写入aaaa.ser文件
os.close();
注:
1.序列化过程中,对象中的其他被创建的对象的类都必须实现Serializable,除非对象被声明为transient(瞬时的)
2.static变量是每个类享有一个,故不会被序列化
②解序列化(Deserialization),对象的还原
FileInputStream fs=new FileInputStream("aaaa.ser")
//如果文件不存在,会抛出异常 FileNotFoundException
ObjectInputStream os=new ObjectInputStream(fs);
Object one=os.readObject();
//Object two=os.readObject();
//会按顺序一个个读出对象,超过次数会抛出异常
aa cd=(aa) one;(由于返回值是Object 类型,所以要强制转换为aa类
)
os.close();
注:
1.解序列化过程中,如果JAVA虚拟机找不到或无法加载要还原的对象的类,则会抛出异常,ClassNotFoundException
2.新的对象会被配置在堆上,但该类的构造函数不会被执行(直接根据保存的信息还原对象,如果构造函数被执行了,就是个新的对象,不能保存原有的数据)
3.继承树上如果有不可序列化的祖先类,则可序列化的祖先类(一直到第一个不可序列化的祖先类)将被按保存的文件还原,不可序列化的祖先类及以上调用其构造函数
4.被声明为transient的实例变量会被赋值为NULL,或primitive主数据类型被默认为0,"' ,false 等
③ 字符串写入文本文件
import java.io.*;
FileWriter writer = new FileWriter(''aaaaa.txt'');
//同样相对路径默认保存在workspace 下,也可为绝对路径,不过'\'要转换为'/'
writer.write("wo xiang chi chashaofan");
writer.close();
④ 缓冲区
BufferedWriter writer = new BufferedWriter(new FileWriter(aFile));
BufferedReader reader = new BufferedReader(new FileReader(myFile));
writer.close();
reader.close();
reader.readLine() 缓冲区有内容时返回内容(String),没有时返回NULL
writer.flush() 可以强制把缓冲区的内容写入
⑤serialVersionUID
对象序列化的同时对象会被盖上个版本印章
类某方面变化,版本号就会变化
可以设置其不可变
用JAVA Development Kit 里面的serialver 可以取得类当前的版本号
在类中声明static final long serialVersionUID=-153243459248(得到的一个很长的值),可以使版本号不变
以下是Head Fisrt Java 中的一个序列化例子:
QuizCard 例