(一)序列化流与反序列流
【定义】
序列化流:将对象和对象的内容转换为字节保存。
反序列化流:将字节转换为对应的对象和信息。
【序列化要求】
(1)需要序列化的对象的类,必须实现 Serializable 接口,Serializable 接口是一个标记接口,接口中没有对应的方法。
补充:Cloneable也是一个标记接口,如果一个类要实现clone方法,则该类必须实现Cloneable接口
(2)最好设置serialVersionUID的值。(可以通过eclipse自动指定)
一个类在实现了 Serializable 接口后会自动根据类中的属性和方法计算出一个 serialVersionUID 值。这个 UID 会跟随对象序列化到文件中。但如果在序列化后增加了一个属性,那么会自动根据新的属性和方法计算出一个新的 UID 。在反序列化的时候,首先会获取 UID ,如果流中的 UID 和本地类的 UID 不同,那么就会拒绝反序列化,并且抛出异常。如果序列化 UID 相同,那么就会反序列化成功。只要手动的指定了一个 UID ,那么系统就不会自动根据属性和方法计算 UID
(3)被static 修饰的属性不能被序列化。
(4)被transient 修饰的属性强制性不能序列化。
补充:集合和Map 中常用的类大多不能被序列化,因为在类中许多属性被设置为transient或者static
【为什么要使用序列化】
由定义可知,序列化是将对象和对象的内容转换为字节保存。换句话说,有些对象,我不仅把它保存在我的内存中,我还要把它保存在我的硬盘里。此时我就可以将该对象,存储在硬盘中,需要时,在进行反序列操作。
(二)序列化流与反序列流实现
【序列化操作】
public class SerializeDemo {
public static void main(String[] args) throws IOException {
//实例化对象
Person p = new Person("张三", 18);
//创建ObjectOutputStream对象,用于输出操作
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("E:\\person.data"));
//将对象写入到指定文件中
oos.writeObject(p);
//关流
oos.close();
}
}
class Person implements Serializable{
private static final long serialVersionUID = -6327020381644514281L;
private String name;
private int age;
public Person() {
}
public Person(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;
}
}
- 创建实体类,实现Serilizable接口(标记接口)
- 创建ObjectOutputStream对象,传入FileOutputStream(字节流)对象
- 调用writeObject()方法,传入要写入的对象 ,最后关流操作。
【反序列化】
public static void main(String[] args) throws Exception {
Person p = new Person();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("E:\\person.data"));
p = (Person) ois.readObject();
System.out.println(p);
ois.close();
}
- 创建ObjectInputStream对象,并且传入FileInputStream对象
- 调用readObject()方法,返回序列化的内容
补充:
1、使用transient修饰的属性不能被序列化,在反序列的时候,它存储的内容会为null。
2、使用static修饰的属性不能被序列化,因为static修饰的属性是共享的,他会随着我们的修改而变化
(三)持久化存储类Properties
【简介】
- Properties是用于做持久化存储的映射。
- Properties是Hashtable的子类,key和value不能为null,key和value的类型必须是String类型
【存入】
public static void main(String[] args) throws Exception {
Properties pro = new Properties();
//存放元素
pro.put("Angle", "天使");
pro.put("baby", "宝贝");
FileOutputStream fos = new FileOutputStream("data.properties");
// 持久化存储到文件中 持久化存储的文件必须是.properties结尾
//参数2:对应文件的注释内容
pro.store(fos,"simple Name");
fos.close();
}
- 声明Properties对象
- 调用put方法,存放对象。存放的内容不能为null,必须为String
- 实例化FileOutputStream对象,用以存储位置
- 调用Store方法,参数2:对应文件的注释内容
- 关流
注意:持久化存储到文件中 持久化存储的文件必须是.properties结尾
【取出】
public static void main(String[] args) throws Exception {
Properties pro = new Properties();
pro.load(new FileInputStream("data.properties"));
String name = pro.getProperty("Angle");
System.out.println(name);
}
- 声明Properties对象
- 调用load方法,加载文件。
- 使用getProperty(key)方法,获取value值。
- 输出值
注意:如果,不存在的key,则返回null