在前面我们学习了用一些特定的方法可以将int,double等类型的数据进行输入输出处理。现在假设我们有一个Student类,每个Student对象包含了姓名,语文,数学,英语的成绩。姓名是String类型,成绩是int类型,现在想把Student对象的数据保存下来,你会想到什么办法?当然,用前面的办法可以用writeInt等方法输出到文件中,用readInt等方法从文件中读出来,可是如果我们遇到一个不止思想数据的对象呢???
对象串行化就是直接把整个对象做输入输出处理,java提供了一种机制来完成这个工作,它的名字就叫串行化Serialization,简单的说,就是把对象中的属性,按照流的方法来做输入输出处理,这里要注意,只有属性可以做串行化处理,因为属性是变量,可以存储数据,方法是程序代码,做输出输入处理没有意义。
只要一个类实现了Serializable接口,这个类的对象就可以串行化,Serializable接口是个标记接口,标记接口是指没有定义任何的成员,简单地说就是一个空接口,在前面学习对象复制的时候Cloneable接口也是空接口。实现标记接口的类内部不需要做任何改变(接口没有方法让它去实现);
下面我们来写一个可以串行化的类:(这里有个问题,结果在文件里是乱码,不过不影响再从文件获取数据)
package ch21;
import java.io.*;
//Student类实现了Serializable接口,所以它的对象可以串行化输入输出
public class Studentimplements Serializable
{
private String name;
private int chScore, engScore;
private transient int mathScore;//transient用于修饰希望在串行化过程中不想被串行化的属性
public Student(String n, int c,int e,int m)
{
name = n;
chScore = c;
engScore = e;
mathScore = m;
}
public double avgScore()
{
return (chScore+engScore+mathScore)/3.0;
}
public void printData()
{
System.out.println("姓名:"+name);
System.out.println("语文:"+chScore);
System.out.println("英文:"+engScore);
System.out.println("数学:"+mathScore);
System.out.println("平均:"+avgScore());
}
}
写一个类来写串行化数据:
package ch21;
import java.io.*;
public class ObjectSerializationExample1
{
public static void main(String argv[])
{
int c = Integer.parseInt(argv[1]);
int e = Integer.parseInt(argv[2]);
int m = Integer.parseInt(argv[3]);
Student st = new Student(argv[0], c, e, m);
st.printData();
try {
FileOutputStream fout = new FileOutputStream("C:\\Data.txt");
ObjectOutputStream objOut = new ObjectOutputStream(fout);//数据流连接机制!!!
objOut.writeObject(st);//写串行化对象
objOut.close();
fout.close();
}
catch (IOException ie)
{
System.err.println(e);
}
}
}
读出串行化数据:
package ch21;
import java.io.*;
public class ObjectSerializationExample2
{
public static void main(String argv[])
{
try {
FileInputStream fin = new FileInputStream("Data.txt");
ObjectInputStream objIn = new ObjectInputStream(fin);//数据流连接!!!
Student st = (Student)objIn.readObject();//获取串行化数据
st.printData();
objIn.close();
fin.close();
}
catch (Exception e)
{
System.err.println(e);
}
}
}
结果:
姓名:java
语文:90
英文:80
数学:0
平均:56.666666666666664
可以看transient关键字发生了作用