简单介绍序列化:序列化就是讲对象写入到输出流中,用来存储或传输,反之反序列化就是从输入流中读取对象。
准备Dog类:
class Dog{
private String name;
private int age;
public Dog(String name, int age) {
this.name = name;
this.age = age;
}
public void shout(){
System.out.println("小狗汪汪叫!");
}
public Dog() {
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", 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;
}
对象输出方法(序列化的过程:将对象变成流存储):
public static void writeObjects(){
Dog dog = new Dog("旺旺", 1);
//obj是拓展名词,想怎么写怎么写
File file = new File("dog.obj");
try {
//字节文件输出流
OutputStream out = new FileOutputStream(file);
//对象输出流
ObjectOutputStream oos = new ObjectOutputStream(out);
oos.writeObject(dog);
//关闭流---自动关闭文件输出流
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
第一次测试结果:
报错了:说是Dog类不具备序列化的功能。
这时就需要将Dog类实现 Serializable 接口
第二次测试成功保存到本地:
反序列化:
/**
* 对象反序列化:从文件中把对象读取出来,并还原成对象
*/
public static void readObjects(){
//obj是拓展名词,想怎么写怎么写
File file = new File("dog.obj");
try {
//字节文件输入流
InputStream in = new FileInputStream(file);
//对象输入流
ObjectInputStream ois = new ObjectInputStream(in);
Dog dog = (Dog)ois.readObject();
System.out.println(dog);
//关闭流---自动关闭文件输入流
ois.close();
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
测试结果:
序列化一组对象时也需要按照顺序读或存:可以放入数组或集合,然后将数组或集合作为一个整体进行序列化或反序列化的过程。
transient关键字
这个关键字修饰一个类的属性会使这个类创建的对象在序列化时忽略这个属性值。