序列化和反序列化
- 序列化就是在保存数据时,保存数据的值和数据类型
- 反序列化就是在恢复数据时,恢复数据的值和数据类型
- 需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:Serializable ;Externalizable
- 读写顺序要一致
- 要求实现序列化或反序列化对象 ,需要 实现 Serializable
- 序列化的类中建议添加SerialVersionUlD,为了提高版本的兼容性
- 序列化对象时默认将里面所有属性都进行序列化,但除了static或transient修饰的成员
- 序列化对象时,要求里面属性的类型也需要实现序列化接口
- 序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化
序列化程序
/**
*序列化
*/
public class ObjectOutputStream {
public static void main(String[] args) throws IOException {
String filePath = "D:\\aaaaa.txt"; //序列化后,保存的文件格式,不是存文本,而是按照他的格式来保存
java.io.ObjectOutputStream oOS = new java.io.ObjectOutputStream(new FileOutputStream(filePath));
oOS.writeInt(100);// int -> Integer (实现了 Serializable)
oOS.writeBoolean(true);// boolean -> Boolean (实现了 Serializable)
oOS.writeChar('a');// char -> Character (实现了 Serializable)
oOS.writeDouble(9.5);// double -> Double (实现了 Serializable)
oOS.writeUTF("天天开心");//String
oOS.writeObject(new Cat("花花", 5));
oOS.close();
System.out.println("序列化成功");
}
}
反序列化程序
import com.hspedu.IO.OutputStream.Cat;
import java.io.*;
/**
*反序列化
*/
public class ObjectInputStream_ {
public static void main(String[] args) throws IOException, ClassNotFoundException {
String filePath = "D:\\aaaaa.txt";
ObjectInputStream oIS = new ObjectInputStream(new FileInputStream(filePath));
//读取(反序列化)的顺序需要和你保存数据(序列化)的顺序一致,否则会出现异常
System.out.println(oIS.readInt());
System.out.println(oIS.readBoolean());
System.out.println(oIS.readChar());
System.out.println(oIS.readDouble());
System.out.println(oIS.readUTF());
//cat 的编译类型是 Object , cat 的运行类型是 Cat
Object cat = oIS.readObject();
System.out.println("运行信息"+cat.getClass());
// 如果我们希望调用Cat的方法, 需要向下转型
// 需要我们将Cat类的定义,放在到可以引用的位置
Cat cat1 = (Cat) cat;
System.out.println(cat1.getName()+cat1.getAge());
oIS.close();
}
}
公共类 实现 Serializable 接口
import java.io.Serializable;
/**
* 公共类 实现 Serializable 接口
*/
public class Cat implements Serializable {
private String name;
private int age;
public Cat(String name, int age) {
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 "Cat{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}