开发过程中经常需要将自己定义的类的对象存储到本地,再从本地读取,或者网络传输。
这就需要用到序列化接口、Object流,(Object类是所有类的直接父类,即所有类都是Object)
序列化接口就是Serializable接口,实现这个接口之后,才可以用Object流将类的对象序列化的存储到本地。
请看下面一段代码,定义一个Student类,实现序列化,并new出一个对象,用构造方法对变量进行赋值操作,再储存到本地,在读取到另一个对象中,然后用toString方法打印到屏幕上。
这段代码用了标准的开发编码规范,封装了成员变量。
import java.io.*;
/**
* 定义一个Student类,并实现Serializable接口,
* 实现了这个接口,这个类就可以序列化的储存到文件中,
* 这个类中封装了3个变量,分别为 姓名、学号、成绩
* 并提供了get set方法
* */
class Student implements Serializable{
private String name=null;
private int num=0;
private double fenshu=0;
public Student(String name,int num,double fenshu){
this.name=name;
this.num=num;
this.fenshu=fenshu;
}
/**
* 重写了toString方法,可以直接输出一句话
* */
@Override
public String toString(){
String str="这个学生是"+getName()+",学号是"+getNum()+",分数是:"+getFenshu()+"分";
return str;
}
public double getFenshu() {
return fenshu;
}
public void setFenshu(double fenshu) {
this.fenshu = fenshu;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
}
public class MyObjectStream {
static public void main(String[] args){
//定义一个stu对象,存储到文件中,并读取到stu2中。
Student stu=new Student("王皓城",15101704,82);
Student stu2=null;
//准备存储这个Object,在外面声明2个流
ObjectOutputStream objOutStream=null;
ObjectInputStream objInStream=null;
try {
//实例化上面声明的两个流,并传入匿名文件流指定位置。
objOutStream=new ObjectOutputStream(new FileOutputStream("D:\\1234.txt"));
objOutStream.writeObject(stu);
//已经存储到1234.txt中,下面用输入流读取。
objInStream=new ObjectInputStream(new FileInputStream("D:\\1234.txt"));
stu2= (Student) objInStream.readObject();
//已经读取到这个Student类,并打印到屏幕。
System.out.println(stu2);
} catch (IOException e) {
System.out.println("读取或写入文件时异常!");
} catch (ClassNotFoundException e) {
System.out.println("读取到的文件里面不含类的对象");
} finally {
//最后关闭流,关闭程序
try {
objOutStream.close();
objInStream.close();
System.exit(-1);
} catch (IOException e) {
System.exit(-1);
}
}
}
}