java對象序列化機制一般來講有兩種用途:
1.需要将對象的狀态儲存到檔案中,而後能夠通過讀入對象狀态來重新構造對象,恢複程式狀态
2.使用套接字在網絡上傳送對象的程式來說,是很有用的。
我們通過讓類實作java.io.Serializable 接口可以将類序列化。這個接口是一個制造者(marker)接口。也就是說,對于要實作它的類來說,該接口不需要實作任何方法。它主要用來通知Java虛拟機(JVM),需要将一個對象序列化。
對于這個,有幾點我們需要明确:
1.并非所有類都可以序列化,在cmd下,我們輸入serialver java.net.socket,可以得到socket是否可序列化的資訊,實際上socket是不可序列化的。
2.java有很多基礎類已經實作了serializable接口,比如string,vector等。但是比如hashtable就沒有實作serializable接口。
将對象讀出或者寫入流的主要類有兩個: ObjectOutputStream與ObjectInputStream 。ObjectOutputStream 提供用來将對象寫入輸出流的writeObject方法, ObjectInputStream提供從輸入流中讀出對象的readObject方法。使用這些方法的對象必須已經被序列化的。也就是說,必須已經實作Serializable接口。如果你想writeobject一個hashtable對象,那麼,會得到一個異常。
下面舉個例子:
package com.vitamin.Console;
import java.io.*;
import com.sun.org.apache.bcel.internal.classfile.JavaClass;
class Student implements Serializable
{
public String name;
public int age;
public Student()
{
}
public Student(String name,int age)
this.name = name;
this.age = age;
public int getAge() {
return age;
public void setAge(int age) {
public String getName() {
return name;
public void setName(String name) {
}
public class test
public static void main(String[] args)
// TODO 自動生成方法存根
Student stu1 = new Student("phinecos",20);
Student stu2 = null;
try
{
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("c:\\a.data"));
out.writeObject(stu1);
out.flush();
out.close();
}
catch(Exception ex)
System.err.println(ex.getMessage().toString());
try
ObjectInputStream in = new ObjectInputStream( new FileInputStream("c:\\a.data"));
stu2 = (Student) in.readObject();
in.close();
catch (Exception e)
stu2 = new Student();
System.out.println( "Original data: " + stu2.getName()+" "+stu2.getAge() );