对象序列化有什么作用?
程序在运行过程中,可能需要将一些数据永久的保存到磁盘上,而数据在Java中都是保存在对象当中的。那么我们要怎样将对象中的数据保存到磁盘上呢?这时就需要使用Java中的对象序列化。
定义:
对象的序列化(Serializable)是指将一个Java对象转换成一个I/O流中字节序列的过程。
目的:
为了将对象保存到磁盘中,或允许在网络中直接传输对象。
说明:
对象序列化可以使内存中的Java对象转换成与平台无关的二进制流;
既可以将这种二进制流持久地保存在磁盘上,又可以通过网络将这种二进制流传输到另一个网络节点;
其他程序在获得了这种二进制流后,还可以将它恢复成原来的Java对象;这种将I/O流中的字节序列恢复为Java对象的过程被称之为反序列化(Deserialize)。
说明:
想让某个对象支持序列化,那么这个对象所在的类必须是可序列化的。在Java中,可序列化的类必须实现Serializable或Externalizable两个接口之一。
示例(通过Serializable接口实现对象序列化):
public class Person implements Serializable {//指定类实现序列化接口
// 为该类指定一个serialVersionUID变量值
private static final long serialVersionUID = 1L;
//标识Java类的序列化版本。如果不显示的定义serialVersionUID变量值,那么将由JVM根据类的相关信息计算出一个serialVersionUID变量值。
//声明变量
private int id;
private String name;
private int age;
// 此处省略各属性的getter和setter方法
...
}
要把对象保存到文件当中,是程序到文件的过程,是一个输出操作
ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。
可以使用 ObjectInputStream 读取(重构)对象。
通过在流中使用文件可以实现对象的持久存储。
package liu;
import java.io.*;
public class ObjDomo {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("c:\\javas\\qq.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
Person p = new Person("dfuh", 23);
oos.writeObject(p);
}
}
class Person implements Serializable{
String name;
int age;
public Person(String name, int age) {
super();
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;
}
public String toString() {
return name+" "+age;
}
}
我们知道,实现了接口就要实现接口中的抽象方法
但是为什么我们上面的代码没有继承任何抽象方法
因为上面代码中实现的接口中没用任何的方法,所以就不需要去实现
记事本中得到的结果是乱码,这是正确的我们没有必要在文本中打开它,我们会在以后进行反序列化进行读取。
下面看序列化的完整代码:
package liu;
import java.io.*;
public class XuLieHua_ObjDomo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
FileOutputStream fos = new FileOutputStream("c:\\javas\\qq.txt");//字节流
ObjectOutputStream oos = new ObjectOutputStream(fos);//对象输出流
Person p = new Person("dfuh", 23);//创建一个对象
oos.writeObject(p);//存到磁盘上,序列化
FileInputStream fis = new FileInputStream("c:\\javas\\qq.txt");
ObjectInputStream ois = new ObjectInputStream(fis);//对象输入流
System.out.println(ois.readObject());//读的时候,反序列化
}
}
class Person implements Serializable{
String name;
int age;
private static final long serialVersionUID = 1L ;//L表示long值
public Person(String name, int age) {
super();
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;
}
public String toString() {
return name+" "+age;
}
}
可以在上图中看出,对象序列化与反序列化的结果。