引入序列化:
计算机对于数据的传输是以字节进行传输的,但是在java中对于基本类型可以直接通过getBytes()方法进行转码传输,但是对于对象却不可以直接转为字节,所以需要引入序列化的接口,可以将对象进行传输操作。
序列化概念:
序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
序列化与反序列化的处理:
JAVA中对于对象的状态序列化和反序列化,提供了一对操作API,ObjectInputStream 和ObjectOutputStream 这两个可以将可序列化的对象的状态序列化到文件中保存或者传输。
可序列化的对象,这个类必须是实现了Serializable接口的类,而且其成员变量也必须是可序列化的。public class FilePathDemo implements Serializable{
}
一个简单的序列化例子说明一切(看注释,注释为要点)
package serializable;
import java.io.Serializable;
//定义一个对象的类,实现序列化接口Serializable,该接口中没有需要覆写的抽象方法,直接实现即可
public class StudentInfo implements Serializable{
private String name;
private int age;
public StudentInfo() {
}
public StudentInfo(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "StudentInfo [name=" + name + ", age=" + age + "]";
}
}
实现序列化和反序列化
package serializable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 创建一个空白的文件
File file = new File("F:" + File.separator + "test.txt");
file.createNewFile();
// 定义一个对象
StudentInfo student = new StudentInfo("zhangsan", 19);
// 序列化,将对象传输到指定的文件中
FileOutputStream out = new FileOutputStream(file);
ObjectOutputStream outputStream = new ObjectOutputStream(out);
outputStream.writeObject(student);
outputStream.flush();
outputStream.close();
out.close();
// 反序列化,从指定的位置文件中获取对象,在控制台输出
FileInputStream fis = new FileInputStream(file);
ObjectInputStream in = new ObjectInputStream(fis);
StudentInfo studentInfo = (StudentInfo) in.readObject();
System.out.println(studentInfo);
in.close();
fis.close();
}
}
结果:在序列化结束的时候会在生成的空白文件中存放我们放入的对象信息,但是由于记事本和eclipse的序列化效果不一样,所以在文件中会乱码,但是同样是成功的效果,反序列化后会从文件中得到我们想要的对象,需要强转一下输出即可。
文件中输出序列化的结果:
eclipse的控制台中输出反序列化结果:
序列化其他总结:
父类如果是可序列化的,子类也是可序列化的;类的成员变量全部是可序列化的,类才能被正常可序列化。