java.io 与对象序列化 笔记

来源:互联网 发布:青蜂网络 编辑:程序博客网 时间:2024/05/23 11:51
①序列化对象写入文件(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 例