一、目录
- 引出对象流
- 序列化和反序列化
- 对象流基本介绍
- ObjectOutputSteam
- ObjectInputSteam
- 对象流细节
- 将int num = 100这个int数据保存到文件中,注意不是100数字,而是int 100,并且,能够从文件中直接恢复int 100。
- 将Dog dog = new Dog(“小黄”, 3)这个dog对象保存到文件中,并且能够从文件恢复。
- 上面的要求,就是能够将基本数据类型或者对象进行序列化和反序列化操作。
- 序列化就是在保存数据时,保存数据的值和数据类型。
- 反序列化就是在恢复数据时,恢复数据的值和数据类型。
- 需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的,该类必须实现如下连个接口之一:
- Serializable
- Externalizable //该接口有方法需要实现,因为一般不会使用它,使用Serializable。
- 功能:提供了对基本类型或对象类型的序列化和反序列化的方法。
- ObjectOutputStream提供序列化功能。
- ObjectInputStream提供反序列化功能。
示例: 使用ObjectOutputStream序列化基本数据类型和一个Dog对象(name, age),并保存到data.dat文件中。
package com.javaObjectOutputStream;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class JavaObjectOutputStream {
public static void main(String[] args) throws Exception{
String filepath = "E:\\code\\java\\code\\data.dat";
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(filepath));
objectOutputStream.writeInt(100); //int -> Integer(实现了Serializable接口)
objectOutputStream.writeBoolean(true); //boolean -> Boolean(实现了Serializable接口)
objectOutputStream.writeChar('a'); //char -> Character(实现了Serializable接口)
objectOutputStream.writeUTF("hello"); //String实现了Serializable接口
//保存一个dog对象
objectOutputStream.writeObject(new Dog(1, "Tog"));
objectOutputStream.close();
System.out.println("Serializable Successfully");
}
}
class Dog implements Serializable {
private int age;
private String name;
public Dog(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Dog{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
六、ObjectInputSteam
将上面序列化的文件data.dat反序列化,恢复数据。
读取(反序列化)的顺序需要和保存数据(序列化)的顺序一致,否则会出现异常。
package com.javaObjectInputStream;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class JavaObjectInputStream {
public static void main(String[] args) throws Exception{
String filepath = "E:\\code\\java\\code\\data.dat";
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(filepath));
System.out.println(objectInputStream.readInt());
System.out.println(objectInputStream.readBoolean());
System.out.println(objectInputStream.readChar());
System.out.println(objectInputStream.readUTF());
System.out.println(objectInputStream.readObject());
objectInputStream.close();
}
}
七、对象流细节
- 读写顺序要一致。
- 要求实现序列化或反序列化对象,需要实现Serializable。
- 序列化的类中建议添加SerialVersionUID,为了提高版本的兼容性。
- 序列化对象时,默认将里面所有属性都进行序列化,但除了static或transient修饰的成员。
- 序列化对象时,要求里面属性的类型也需要实现序列化接口。
- 序列化具备可继承性,也就是如果某类已经实现了序列化,则它的所有子类也已经默认实现了序列化。