对象序列化有什么作用?
程序在运行过程中,可能需要将一些数据永久的保存到磁盘上,而数据在Java中都是保存在对象当中的。那么我们要怎样将对象中的数据保存到磁盘上呢?这时就需要使用Java中的对象序列化

定义:
对象的序列化(Serializable)是指将一个Java对象转换成一个I/O流中字节序列的过程。

目的:
为了将对象保存到磁盘中,或允许在网络中直接传输对象。

说明:
对象序列化可以使内存中的Java对象转换成与平台无关的二进制流;

既可以将这种二进制流持久地保存在磁盘上,又可以通过网络将这种二进制流传输到另一个网络节点;

其他程序在获得了这种二进制流后,还可以将它恢复成原来的Java对象;这种将I/O流中的字节序列恢复为Java对象的过程被称之为反序列化(Deserialize)。

说明:

想让某个对象支持序列化,那么这个对象所在的类必须是可序列化的。在Java中,可序列化的类必须实现Serializable或Externalizable两个接口之一

java持久化api java持久化到磁盘_java


示例(通过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方法
          ...
    }

java持久化api java持久化到磁盘_java_02


要把对象保存到文件当中,是程序到文件的过程,是一个输出操作

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;
 }
}

我们知道,实现了接口就要实现接口中的抽象方法

但是为什么我们上面的代码没有继承任何抽象方法

因为上面代码中实现的接口中没用任何的方法,所以就不需要去实现

java持久化api java持久化到磁盘_java持久化api_03


记事本中得到的结果是乱码,这是正确的我们没有必要在文本中打开它,我们会在以后进行反序列化进行读取。

下面看序列化的完整代码:

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;
	}
}

java持久化api java持久化到磁盘_java持久化api_04


可以在上图中看出,对象序列化与反序列化的结果。