什么是对象的序列化和反序列化:
众所周知java对象是可以通过IO写入到文件或者数据库中的,这个过程也就是序列化。相反的,java应用程序也可以通过IO流从文件或者数据库中获取数据并创建对象,这个过程称之为反序列化。
实现的前提:
对象要能被序列化首先要实现序列化接口(Serializable),其次需要通过java.io.ObjectOutputStream类来具体操作;
至于反序列化则只需要java.io.ObjectIntputStream类就行了。
具体操作:
序列化:
package csdn;
import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class User implements Serializable{
String name;
int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
}
public class MyTest {
public static void main(String[] args)throws Exception {
File file = new File("./test.txt");
if (!file.exists()){
file.createNewFile(); //没有test.txt文件则创建
}
FileOutputStream fileOutputStream = new FileOutputStream(file); // 获取该文件的输出流
ObjectOutputStream outputStream = new ObjectOutputStream(fileOutputStream);
User user = new User(); // 要被序列化的对象
user.setAge(12);
user.setName("name");
outputStream.writeObject(user);// 将对象写入文件
}
}
代码说明:定义User类,通过输出流来将对象写入文件。
打开对应的文件,可以看到:
对象的反序列化:
package csdn;
import java.io.*;
class User implements Serializable{
String name;
int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
}
public class MyTest {
public static void main(String[] args)throws Exception {
File file = new File("./test.txt");
if (!file.exists()) {
file.createNewFile(); //没有test.txt文件则创建
}
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(file));
User o = (User)inputStream.readObject(); // 反序列化
// 由于我们知道该对象是User类的对象,可以直接将对象o向下转型
System.out.println(o);
System.out.println(o.age);
System.out.println(o.name);
}
}
输出结果如下:
说明:由此可见反序列化已经完成了。 当然如果对象的成员变量是引用类型的话,对应的类同样要实现序列化接口,否则会导致序列化失败。
最后分享一下我对什么时候用输入流,什么时候用输出流的理解:数据读出内存用输入流,内存读出的用输出流。(个人见解,不喜勿喷)。