IO基础(序列化和反序列化)
一、什么是序列化和反序列化
对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象
这种机制就是使用一个字节序列表示一个对象, 该字节序列包含:对象的类型。对象的数据和对象中存储的属性等信息字节序列写到文件之后,相当于文件中持久保存了一个对象的信息
反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化
要实现序列化和反序列化就要使用对象序列化流和对象反序列化流:
●对象序列化流: ObjectOutputStream
●对象反序列化流: ObjectinputStream
二、什么时候需要序列
1、把内存中的对象状态保存到一个文件中或者数据库中时候;
2、 用套接字在网络上传送对象的时候
三、如何实现序列化
对象序列化/反序列化的前提是对象的类要实现Serializable接口.
Serialiable 接口是一个标志接口,没有任何成员.就是告诉编译器可以进行序列化.
一般情况下,类实现了Serializable 接口后,要手动的添加一个序列化版本号字段:
公共类person类 测试序列化和反序列化
import java.io.Serializable;
/**
* 描述:person类 测试序列化和反序列化
*/
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person(String name) {
this.name = name;
}
}
对象序列化流: ObjectOutputStream
●将Java对象的原始数据类型和图形写入OutputStream, 可以使用ObjectlnputStream读取 (重构)对象。可以通过使用流的文件来实现对象的特久存储。如果流是网络套接字流,则可以在另一个主机上或另一个进程中重构对象
构造方法:
●ObjectOutputStream(OutputStreamout):
创建一个写入指定的Outputstrearm的ObjectOutputStrearm序列化对象的方法:
●. void writeObject(Object obj): 将指定的对象写入ObjectOutputStream
序列化测试类代码如下:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
/**
* 描述:把Person类进行序列化
*/
public class Test {
public static void main(String[] args) throws Exception {
serializePerson();
}
/**
* 序列化
*/
private static void serializePerson() throws IOException {
Person person = new Person("123");
// ObjectOutputStream 对象输出流
// person.txt 文件中,完成对 person 对象的序列化操作
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("test01\\person.txt")));
oos.writeObject(person);
System.out.println("person 对象序列化成功!");
oos.close();
}
}
对象反序列化流: ObjectinputStream
使用ObjectnputStream进行反字列化,简单的理解为把文件中的对象读取出来
反序列化对象的方法:
●ObjectreadObject(): 从ObjectnputStream读取 一个对象
进行反序列化测试代码:
import java.io.*;
/**
* 描述:进行反序列化
*/
public class Test {
public static void main(String[] args) throws Exception {
Person person = deserializePerson();
System.out.println(person.toString());
}
/**
* 反序列化
*/
private static Person deserializePerson() throws Exception {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("e:/person.txt")));
Person person = (Person) ois.readObject();
System.out.println("person 对象反序列化成功!");
return person;
}
}
四、序列化和反序列化总结
1、一个类如果想被序列化,那么需要实现一个Serializable接口。
2、类中的静态变量的值是不会被进行序列化的,transient 修饰的属性,是不会被序列化的,内置类型 为对应0值。引用类型为null;用transient关键字标记的成员变量不参与序列化过程。
3、在实现这个Serializable 接口的时候,一定要给这个 serialVersionUID 赋值,最好设置为1L,这 个L最好大写来区分,不然小写看起来像是1,不同的 serialVersionUID 的值,会影响到反序列化