每天进步一点点-序列化和反序列(将对象写入硬盘文件and从硬盘文件读出对象)

一个类如果实现了Serializable接口,那么这个类创建的对象就是所谓序列化的对象。所谓“对象序列化”: 简单一句话:使用它可以象存储文本或者数字一样简单的存储对象。一个应用是,程序在执行过程中突然遇到短电或者其他的故障导致程序终止,那么对象当前的工作状态也就会丢失,这对于有些应用来说是可怕的。用对象序列化就可以解决这个问题,因为它可以将对象的全部内容保存于磁盘的文件,这样对象执行状态也就被存储了,到需要时还可以将其从文件中按原样再读取出来,这样就解决了数据丢失问题。对象序列化可以简单这么实现:为需要被序列化的对象实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。


 


 

 


import Student;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

class Student implements Serializable {
	private static final long serialVersionUID = 1L;  //最好加上吧
	String name;
	int id;
	int age;
	String department;

	public Student(String name, int id, int age, String department) {
		this.age = age;
		this.department = department;
		this.id = id;
		this.name = name;
	}
	public void say(){
		System.out.println("hi"+name);
	}
}

public class serializtion {

	public static void main(String[] args) throws IOException {
		Student s1 = new Student("张三", 1, 15, "化学");
		Student s2 = new Student("李四", 2, 19, "生物");
		Student s3 = new Student("龙儿", 2, 19, "生物"); Student s4=null;
		FileOutputStream fout = new FileOutputStream("student.txt");
		ObjectOutputStream out = new ObjectOutputStream(fout);
		out.writeObject(s1);
		out.writeObject(s2);
		out.writeObject(s3);
		out.close();
		FileInputStream fin = new FileInputStream("student.txt");
		ObjectInputStream in = new ObjectInputStream(fin);
		try {
			s1 = (Student) in.readObject();
			s2 = (Student) in.readObject();
			s4 = (Student) in.readObject();
		} catch (ClassNotFoundException e) {//照样可以反序列化出来
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		in.close();
		System.out.print("name:" + s1.name);
		System.out.print(" id:" + s1.id);
		System.out.print(" age:" + s1.age);
		System.out.println(" department:" + s1.department);
		System.out.print("name:" + s2.name);
		System.out.print(" id:" + s2.id);
		System.out.print(" age:" + s2.age);
		System.out.println(" department:" + s2.department);
		//name:张三 id:1 age:15 department:化学
		//name:李四 id:2 age:19 department:生物
		s4.say();//从文件中反序列化出来的对象照样可以调用自己的方法
		
	}
}

  


 

 

posted on 2017-08-13 22:31  多情剑客无情剑;  阅读(233)  评论(0编辑  收藏  举报

导航