package cn.serializable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**
* 今天整理以下關於Java的對象序列化相關的問題:
*
* [ObjectOutputStream,ObjectInputStream]
*
*
* 序列化:
* 是指將對象以字節序列的方式表示;其中包括對象的數據,對象的類型,對象中存儲的屬性;
* 當字節序列寫出到文件中後相當於把對象持久化了;以上便是Java對象的序列化;
*
* 反序列化:
* 是指將字節序列從文件中讀取出來的重構對象的方式;
*
* 其中:
* 序列化的對象需要滿足兩個先決條件:
* 1. 該類必須實現java.io.Serializable接口;
* 2. 該類中的所有屬性必須是可序列化的;
* 如果有不需要序列化的屬性可以用transient標記對應的屬性;
*
* 接下來還開始相關的隨筆;
*
* 還是同以往一樣,創建一個自己的測試類;
* @author Administrator
*
*/
public class SerializableTest {
/**
* Java程序的入口|主函數;
* @param args
*/
public static void main(String[] args) {
// 初始化一個文件流路徑;
String path = "D://user.txt";
// 實例化一個自己的Users類;
Users user = new Users();
// 初始化一個空的Users對象;
Users userRead = null;
/**
* 對象賦值;
* 當前爲私有方式,故而需set賦值;
* 普通公共訪問權限直接引用對象.就可以得到;
*/
user.setNAME("Liu .....");
user.setPS("wcadmin");
user.setAGE(110);
user.setID_CARD("622222222111114448");
try {
/**
* 序列化;
*
* 指定序列化地址,實例化ObjectOutputStream序列化對象;
*/
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
// 指定對象的進行序列化;
oos.writeObject(user);
// 資源釋放;
oos.close();
/**
* 反序列化;
* 指定序列化地址,實例化ObjectInputStream反序列化對象;
*/
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
/**
* 讀取序列化數據;
* 指定轉換對象類型;
*/
userRead = (Users) ois.readObject();
// 資源釋放;
ois.close();
// 獲取並打印對象信息;
System.out.println("name: "+userRead.getNAME());
System.out.println("ps: "+userRead.getPS());
System.out.println("age: "+userRead.getAGE());
System.out.println("id_card: "+userRead.getID_CARD());
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
/**
* 封裝臨時的Entity類;
* @author Administrator
*/
class Users implements java.io.Serializable {
/**
* 定義私有變量;
* NAME;
* PS;
* AGE;
* ID_CARD;
*/
private String NAME;
private String PS;
private Integer AGE;
/**
* transient關鍵字:
* 用來標記不需要序列化的數據屬性及內容;
* 表示瞬時態;
*/
private transient String ID_CARD;
// 定義臨時調用方法;
public void goining() {
System.out.println("This is "+ NAME + AGE);
}
/**
* 提供get|set方法;
* @return
*/
public String getNAME() {
return NAME;
}
public void setNAME(String nAME) {
NAME = nAME;
}
public String getPS() {
return PS;
}
public void setPS(String pS) {
PS = pS;
}
public Integer getAGE() {
return AGE;
}
public void setAGE(Integer aGE) {
AGE = aGE;
}
public String getID_CARD() {
return ID_CARD;
}
public void setID_CARD(String iD_CARD) {
ID_CARD = iD_CARD;
}
}
package cn.serializable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
/**
*
* 數據集合的序列化也是同數據對象的序列化一樣;
* 下面的繼續走一則有關序列化的Demo:
*
* 集合序列化;
*
* @author Administrator
*
*/
public class SerializableTest {
/**
* Java程序的入口|主函數;
* @param args
*/
public static void main(String[] args) {
// 初始化一個文件流路徑;
String path = "D://List.txt";
// 利用構造器實例化多個對象;
Users usera = new Users("Liu","admin");
Users userb = new Users("Wang","wcadmin");
Users userc = new Users("Fei","123");
Users userd = new Users("Hu","123445");
// 實例化一個指定裝載Users對象的List容器;
List<Users> list = new ArrayList<Users>();
// List集合數據轉載;
list.add(usera);
list.add(userb);
list.add(userc);
list.add(userd);
try {
/**
* 序列化;
*
* 指定序列化地址,實例化ObjectOutputStream序列化對象;
*/
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path));
// 指定對象的進行序列化;
oos.writeObject(list);
// 資源釋放;
oos.close();
/**
* 反序列化;
* 指定序列化地址,實例化ObjectInputStream反序列化對象;
*/
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path));
/**
* 讀取序列化數據;
* 指定轉換對象類型;
*/
List<Users> listUsers = (List<Users>) ois.readObject();
// 資源釋放;
ois.close();
// 獲取並打印對象信息;
for(Users user : listUsers) {
System.out.println("NAME: " + user.getNAME() + "; PS: " + user.getPS());
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
/**
* 封裝臨時的Entity類;
* @author Administrator
*/
class Users implements java.io.Serializable {
/**
* 定義私有變量;
* NAME;
* PS;
* AGE;
* ID_CARD;
*/
private String NAME;
private String PS;
private Integer AGE;
/**
* transient關鍵字:
* 用來標記不需要序列化的數據屬性及內容;
* 表示瞬時態;
*/
private transient String ID_CARD;
public Users (){}
public Users (String name, String ps) {
this.NAME = name;
this.PS = ps;
}
// 定義臨時調用方法;
public void goining() {
System.out.println("This is "+ NAME + AGE);
}
/**
* 提供get|set方法;
* @return
*/
public String getNAME() {
return NAME;
}
public void setNAME(String nAME) {
NAME = nAME;
}
public String getPS() {
return PS;
}
public void setPS(String pS) {
PS = pS;
}
public Integer getAGE() {
return AGE;
}
public void setAGE(Integer aGE) {
AGE = aGE;
}
public String getID_CARD() {
return ID_CARD;
}
public void setID_CARD(String iD_CARD) {
ID_CARD = iD_CARD;
}
}