java编程笔记17 对象串行化

在前面我们学习了用一些特定的方法可以将int,double等类型的数据进行输入输出处理。现在假设我们有一个Student类,每个Student对象包含了姓名,语文,数学,英语的成绩。姓名是String类型,成绩是int类型,现在想把Student对象的数据保存下来,你会想到什么办法?当然,用前面的办法可以用writeInt等方法输出到文件中,用readInt等方法从文件中读出来,可是如果我们遇到一个不止思想数据的对象呢???

对象串行化就是直接把整个对象做输入输出处理,java提供了一种机制来完成这个工作,它的名字就叫串行化Serialization,简单的说,就是把对象中的属性,按照流的方法来做输入输出处理,这里要注意,只有属性可以做串行化处理,因为属性是变量,可以存储数据,方法是程序代码,做输出输入处理没有意义。

只要一个类实现了Serializable接口,这个类的对象就可以串行化,Serializable接口是个标记接口,标记接口是指没有定义任何的成员,简单地说就是一个空接口,在前面学习对象复制的时候Cloneable接口也是空接口。实现标记接口的类内部不需要做任何改变(接口没有方法让它去实现);

下面我们来写一个可以串行化的类:(这里有个问题,结果在文件里是乱码,不过不影响再从文件获取数据)

package ch21;

import java.io.*;

//Student类实现了Serializable接口,所以它的对象可以串行化输入输出
public class Student implements 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关键字发生了作用


posted @ 2011-03-19 13:02  jinmengzhe  阅读(468)  评论(0编辑  收藏  举报