ObjectInputStream和ObjectOutputStream
1.用于存储和读取基本数据类型数据或对象的处理流,它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来
2.序列化:用ObjectOutputStream类保存基本类型数据或对象的机制
反序列化:用ObjectInputStream类读取基本类型数据或对象的机制
3.ObjectInputStream和ObjectOutputStream不能序列化static和transient修饰的成员变量
4.[面试题]对象序列化机制:允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。当其他程序获取了这种二进制流,就可以恢复成原来的Java对象
5.如果需要让某个对象支持序列化机制,则必须让对象所属的类及其属性是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一(Serializable:标识接口,Externalizable)。否则,会抛出NotSerializableException异常
5.类序列化需要满足的要求
(1)实现Serializable接口
(2)当前类提供全局常量serialVersionUID(对类的唯一标识),如果类没有显式定义这个常量,它的值是Java运行时环境根据类的内部细节自动生成的,若序列化后,对类的实例变量做了修改,serialVersionUID可能发生变化,还原java对象就会出问题了。所以还是建议显式声明。
(3)保证所有类的所有属性是可实例化的,类的实例变量如果为自定义类,该自定义类也必须实现Serializable接口
(4)static和transient修饰的变量不能序列化
序列化、反序列化自定义Person类
public class Demo implements Serializable {
public static void main(String[] args) {
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
try {
//序列化:内存中的java对象保存到磁盘中或通过网络传输出去
oos = new ObjectOutputStream(new FileOutputStream("object.data"));
oos.writeObject(new Person("AA",22));
oos.flush();//刷新操作
//反序列化:将磁盘文件中的对象还原成内存中的一个java对象
ois = new ObjectInputStream(new FileInputStream("object.data"));
Person person = (Person) ois.readObject();
System.out.println(person); //Person{name='AA', age=22}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(oos!=null){
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
//标记Person类可序列化
class Person implements Serializable{
public static final long serialVersionUID=20391L;
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public Person() {
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}