序列化
对象序列化是指将对象保存到磁盘当中,或者是在网络当中传输对象
这种机制就是使用一个字节序列表示一个对象,该字节序列包括:对象的类型、对象的数据和对象中存储的属性等信息,字节序列写到文件之后,相当于文件中持久化保存了一个对象的信息
反之,该字节序列还可以从文件中读取回来,重构对象,对其进行反序列化操作
对象写入一个文件后进行输出
通过原始的手法,把一个学生类对象信息写入的文件里面,最后进行输出
思路
- 创建一个学生类的对象,设置基础属性,姓名,年龄,性别
- 定义一个方法,把学生类对象里面的信息写入到文件
- 定义一个方法,读取写入学生信息的文件,读取成为字符串,进行拆分,读取到的信息,放到匿名学生空间,进行返回
demo:Student类
package com.itxs.demo04;
/**
* @Classname : Student
* @Description : TODO 学生类
* @Author : lin_refuel@qq.com
*/
public class Student {
//学生的三个成员属性
private String name; //姓名
private String sex; //性别
private int age; //年龄
public Student() {
}
public Student(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
}
demo: 写入和读取Student类的信息
package com.itxs.demo04;
import java.io.*;
/**
* @Classname : demo01
* @Description : TODO 对象存储到文件里面
* @Author : lin_refuel@qq.com
*/
public class demo01 {
public static void main(String[] args) throws IOException {
// 对象写入文件
// month();
Student student = move();
System.out.println(student);
}
/**
* 返回一个学生对象的信息
* @return
*/
private static Student move() throws IOException {
//读取学生类信息模板
BufferedReader br = new BufferedReader(new FileReader("D:/JAVA/ce/Student.txt"));
String str = br.readLine();//读取一行
String[] s = str.split("##");//通过##进行分割,分割成字符串数组
br.close();
// 读取的信息,对匿名的空间里面三个属性进行初始化, Integer.parseInt把字符串转int
return new Student(s[0],s[1],Integer.parseInt(s[2]));//把匿名空间进行返回
}
/**
* 学生对象写入文件里面
*/
private static void month() throws IOException {
//实例化学生类对像
Student student = new Student("小肆", "男", 19);
//字符写入
BufferedWriter bw = new BufferedWriter(new FileWriter("D:/JAVA/ce/Student.txt"));
//定义一个字符串,把学生姓名,年龄,性别的属性写入
String str = student.getName() + "##" + student.getSex() + "##" + student.getAge();
//调用方法进行写入
bw.write(str);
bw.close();
}
}
运行结果:
对象序列化与反序列化
要实现序列化与反序列化就需要使用对象序列化流和对象反序列化流:
对象序列化流:
ObjectOuptStream
对象反序列化流:
ObjectInputStream
demo:Student类
package com.itxs.demo04;
import java.io.Serializable;
/**
* @Classname : Student
* @Description : TODO 学生类
* @Author : lin_refuel@qq.com
*/
public class Student implements Serializable {
//学生的三个成员属性
private String name; //姓名
private String sex; //性别
private int age; //年龄
public Student() {
}
public Student(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
}
序列化存储,和反序列化输出
package com.itxs.demo04;
import java.io.*;
/**
* @Classname : demo02
* @Description : TODO 对象序列化和反序列化存储
* @Author : lin_refuel@qq.com
*/
public class demo02 {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//对象实实例化
// Student student = new Student("小肆","男",19);
//对象的序列化存储
// ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:/JAVA/ce/Student.txt"));
//调用方法
// oos.writeObject(student);//文件写入了一个对象
//关闭oos
// oos.close();
//****************************************************************************
//对象反序列化进行输出
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:/JAVA/ce/Student.txt"));
Object o = ois.readObject();
Student s = (Student)o;
System.out.println(s);
System.out.println(s.getName());
System.out.println(s.getSex());
System.out.println(s.getAge());
}
}
对象序列化存储时需要注意的事项
-
对象序列化了一个对象之后,如果修改了对象所属的类文件,读取是否会出现问题?
-
如果出问题了,如何处理?
private static final long serivalVersionUID = 9527L
-
如果一个对象中的某个成员的值不想被序列化,应该如何处理? 通过
transient
关键字修饰即可