對象序列化
定義:通過使用ObjectInputStream和ObjectOutputStream類保存和對象讀取的機制叫做序列化機制
簡單說就是變成本地文件,導彈來了都不怕,硬盤不壞 數據不丟
ObjectInputStream:對象輸入流
ObjectOutputStream:對象輸出流
假如現在有一student信息項目,(代碼如下)
student.java類
public class Student {
/**
*
*/
//封裝
private int stu_id;
private String stu_name;
private int age;
private String school;
//自動生成get和set方法
public int getStu_id() {
return stu_id;
}
public void setStu_id(int stu_id) {
this.stu_id = stu_id;
}
public String getStu_name() {
return stu_name;
}
public void setStu_name(String stu_name) {
this.stu_name = stu_name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
//將地址 ----可視化的string
@Override
public String toString() {
return "Student [stu_id=" + stu_id + ", stu_name=" + stu_name + ", age=" + age + ", school=" + school + "]";
}
}
ObjcetStudy類;
public static void main(String[] args) {
Student s =new Student();
s.setStu_id(1000);
s.setStu_name("張三");
s.setAge(23);
s.setSchool("北大");
為了防止執行崩潰,丟失數據,現在將它序列化
先將對象實例化,添加文件流、對象流,并將文件放在一指定磁盤中
所以修改ObjcetStudy類中代碼
public static void main(String[] args) {
Student s =new Student();
s.setStu_id(1000);
s.setStu_name("張三");
s.setAge(23);
s.setSchool("北大");
//對象實例化
//先文件輸出流
FileOutputStream fos=null;
//對象輸出流
ObjectOutputStream oos =null;
//實例化低級流的對象
try {
fos=new FileOutputStream("E:/zhangsan.bin");//要放在本地磁盤中的路徑,自己定義
oos= new ObjectOutputStream(fos);
//寫出對象
oos.writeObject(s);
System.out.println("執行完畢");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
oos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
修改完ObjcetStudy類此時 還無法執行 代碼,
需要在Student類中 添加Serializable 標識接口
該標識此類對象支持序列化
public class Student implements Serializable{
此時需要自動添加一ID
鼠標放置在黃線處,單擊添加 ID
此時代碼變為:
Student 類:
public class Student implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
//封裝
private int stu_id;
private String stu_name;
private int age;
private String school;
//自動生成get和set方法
public int getStu_id() {
return stu_id;
}
public void setStu_id(int stu_id) {
this.stu_id = stu_id;
}
public String getStu_name() {
return stu_name;
}
public void setStu_name(String stu_name) {
this.stu_name = stu_name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSchool() {
return school;
}
public void setSchool(String school) {
this.school = school;
}
//將地址 ----可視化的string
@Override
public String toString() {
return "Student [stu_id=" + stu_id + ", stu_name=" + stu_name + ", age=" + age + ", school=" + school + "]";
}
ObjcetStudy 類
public class ObjcetStudy {
public static void main(String[] args) {
Student s =new Student();
s.setStu_id(1000);
s.setStu_name("張三");
s.setAge(23);
s.setSchool("北大");
//對象實例化
//先文件輸出流
FileOutputStream fos=null;
//對象輸出流
ObjectOutputStream oos =null;
//實例化低級流的對象
try {
fos=new FileOutputStream("E:/zhangsan.bin");//要放在本地磁盤中的路徑,自己定義
oos= new ObjectOutputStream(fos);
//寫出對象
oos.writeObject(s);
System.out.println("執行完畢");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
oos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
執行代碼,去fos=new FileOutputStream("E:/zhangsan.bin");中自己定義的文件存放路徑中查看自己的文件
反序列化
將文件讀取到java程序中
//文件輸入流
FileInputStream fis=null;
//對象輸入流
ObjectInputStream ois=null;
try {
fis=new FileInputStream("E:/zhangsan.bin");
ois=new ObjectInputStream(fis);
//輸入對象
Student ss=(Student)ois.readObject();
System.out.println(ss);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
ois.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
執行輸出: