一、串行化的意義:
1:解決Web應用程序的無狀態弊端
一旦將某一對象串行化,得到的字節可以存儲在文件、數據庫,或內存中—— 只要是可以存儲的任何地方。需要恢復對象時,僅僅只需從它存儲的位置反串行化即可。對象固有的這種特性對於無狀態的Web應用程序是非常重要的,因爲它允許重要的狀態信息可以在用戶請求之間保留。
2:應用程序邊界之間傳遞對象
串行化也允許對象在應用程序邊界之間傳遞,編程人員可以將描述對象狀態的字節流在網絡上傳遞,並在另一端反串行化成一個匹配的對象。從本質上講,串行化允許對象以“數值”的方式傳遞給另一個應用程序。
二:串行化對象
在java中串行化對象必須:
1、該對象的類必須實現Serializable接口
2、該對象的串行化成員必須是非靜態成員變量,即不能保存任何的成員方法和靜態的成員變量,而且串行化保存的只是變量的值,對於變量的任何修飾符,都不能保存。而對於某些類型的對象,其狀態是瞬時的,這樣的對象是無法保存其狀態的,例如一個Thread對象,或一個FileInputStream對象,對於這些字段,我們必須用transient關鍵字標明 。
注:保存任何的成員方法和靜態的成員變量沒有任何的意義,因爲,對象的類已經完整的保存了他們,如果再串行化他們還有什麼意義呢?呵呵
3、要串行化一個對象,必須與一定的對象輸入/輸出流聯繫起來,通過對象輸出流將對象狀態保存下來,再通過對象輸入流將對象狀態恢復。
三:具體實現
1、串行化的對象:Person類
- import java.io.Serializable;
- /*
- * time:2008-07-19
- * author:coke
- */
- /*
- *必須實現Serializable
- */
- public class Person implements Serializable {
- private static final long serialVersionUID = 1L;
- private int age; // will persist
- private String name; // will persist
- // transient 爲Java保留字,告訴JVM以transient宣告的基本型態(primitive type)或物
- // 件(object)變量不要序列化,例如敏感性數據像是密碼等。
- private transient String pwd; // will not persist
- public Person() {
- }
- public Person(int age, String name,String pwd) {
- this.age = age;
- this.name = name;
- this.pwd=pwd;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getPwd() {
- return pwd;
- }
- public void setPwd(String pwd) {
- this.pwd = pwd;
- }
- }
import java.io.Serializable;
/*
* time:2008-07-19
* author:coke
*/
/*
*必須實現Serializable
*/
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private int age; // will persist
private String name; // will persist
// transient 爲Java保留字,告訴JVM以transient宣告的基本型態(primitive type)或物
// 件(object)變量不要序列化,例如敏感性數據像是密碼等。
private transient String pwd; // will not persist
public Person() {
}
public Person(int age, String name,String pwd) {
this.age = age;
this.name = name;
this.pwd=pwd;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
2、串行化和反串行化
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.File;
- /*
- * time:2008-07-19
- * author:coke
- */
- public class TestSerializable {
- private static File f = null;
- //串行化
- public static void serialization() {
- f = new File("D://t.m");
- try {
- if (f.exists())
- f.delete();
- f.createNewFile();
- } catch (IOException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- Person p = new Person(10, "xplq", "123456");
- try {
- ObjectOutputStream out = new ObjectOutputStream(
- new FileOutputStream(f));
- out.writeObject(p);
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- //反串行化
- public static void deserialization() {
- if (!f.exists())
- return;
- try {
- ObjectInputStream input = new ObjectInputStream(
- new FileInputStream(f.getPath()));
- try {
- Person p = (Person) input.readObject();
- System.out.println(p.getName());
- System.out.println(p.getAge());
- System.out.println(p.getPwd());
- } catch (ClassNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- } catch (FileNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- //測試
- public static void main(String[] args) {
- TestSerializable.serialization();
- TestSerializable.deserialization();
- }
- }
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.File;
/*
* time:2008-07-19
* author:coke
*/
public class TestSerializable {
private static File f = null;
//串行化
public static void serialization() {
f = new File("D://t.m");
try {
if (f.exists())
f.delete();
f.createNewFile();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Person p = new Person(10, "xplq", "123456");
try {
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream(f));
out.writeObject(p);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//反串行化
public static void deserialization() {
if (!f.exists())
return;
try {
ObjectInputStream input = new ObjectInputStream(
new FileInputStream(f.getPath()));
try {
Person p = (Person) input.readObject();
System.out.println(p.getName());
System.out.println(p.getAge());
System.out.println(p.getPwd());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//測試
public static void main(String[] args) {
TestSerializable.serialization();
TestSerializable.deserialization();
}
}
3.測試結果
xplq
10
null
因爲pwd transient ,不能被串行化