序列化
概念:将内存中保存的对象变为二进制流进行输出或保存在文本中(即将对象变为二进制流)
要想让类支持序列化,必须实现Serializable接口(标识接口,只有实现了Serializable接口的类,才具有对象序列化的功能)
具体实现序列化,需要使用io包中提供的两个处理类:
ObjectOutputStream:(序列化类)
public ObjectOutputStream(OutputStream out) throws IOException
主要方法:writeObject(Object Object)---将obj变为二进制流输出到目标终端(终端在构造方法中提供)
ObjectInputStream:(反序列化类)
public ObjectInputStream(InputStream in) throws IOException
主要方法:readObject()---将二进制流变为Object对象
一、序列化
class Person implements Serializable {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = 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;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Test {
public static void main(String[] args) throws Exception{
File file = new File("D:test.txt");
Person p = new Person("Tom",20);
FileOutputStream fileOutputStream = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fileOutputStream);
oos.writeObject(p);
oos.close();
}
}
将一个对象进行序列化,Person类实现了Serializable接口,在主方法中通过ObjectOutputStream中的writeObject方法来进行序列化.这里在D盘创建了一个名为test.txt的文件,将序列化的二进制流保存到了文件中.我们可以看一下这个文件
二、反序列化
既然有序列化就肯定有反序列化,可以将二进制流变成java的对象,具体实现:
class Person implements Serializable {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = 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;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class Test {
public static void main(String[] args) throws Exception{
File file = new File("D:test.txt");
FileInputStream fileInputStream = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fileInputStream);
Person p = (Person)ois.readObject();
System.out.println(p);
ois.close();
}
}
这个方法可以从文件中读取二进制流并将其变为Person对象,输出结果为
可以看到与存进去的对象的值完全一样.
三、transient关键字
若希望类中的若干属性不被序列化,可以在属性前添加transient关键字,有transient关键字的属性在对象进行序列化时并不会保存到二进制流中。
比如我将Person类中的age属性加上transient关键字,再进行序列化
打开保存的test.txt文件
可以看到内容明显比之前的少了很多,再使用这个文件进行反序列化,输出得到的Person类的对象
可以看到age的属性值为空,说明age属性的值并没有保存到二进制流中.这就是transient关键字的作用