閱讀272 返回首頁    go 京東網上商城


java對象序列化的概念和實現


一 序列化的概念和實現方法

序列化的概念就是把一個Object直接轉換成為Byte流寫到硬盤或者通過網絡進行傳播。Java序列化技術可以將一個對象的狀態寫入一個Byte流裏,並且可以從其它地方把該Byte流裏的數據讀出來,重新構造一個相同的對象。這種機製允許將對象通過網絡進行傳播,並可以隨時把對象持久化到數據庫、文件等係統裏。Java的序列化機製是RMI、EJB等技術的技術基礎。

 

序列化就是一種用來處理對象流的機製,所謂對象流也就是將對象的內容進行流化。可以對流化後的對象進行讀寫操作,也可將流化後的對象 傳輸於網絡之間。序列化是為了解決在對對象流進行讀寫操作時所引發的問題。

 

序列化的實現——將需要被序列化的類實現Serializable接口,根據需求讀出或者寫入對象。在web開發中,如果對象被保存在了Session中,tomcat在重啟時要把Session對象序列化到硬盤,這個對象就必須實現Serializable接口。如果對象要經過分布式係統進行網絡傳輸或通過rmi等遠程調用,這就需要在網絡上傳輸對象,被傳輸的對象就必須實現Serializable接口。

 

看例子


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.URISyntaxException;
import cn.Test.FileInputAndOutputStream;


public class ObjectIO
{
 // 將對象寫入文件
 public static void Output(String path)
 {
  Student s = new Student();
  s.num = 2;
  s.name = "xy2";
  s.address = "goodPlace2";
  s.wifeName = "nobody2";

  File f = new File(path);
  FileOutputStream fout = null;
  ObjectOutputStream bout = null;
  try
  {
   fout = new FileOutputStream(f);
   bout = new ObjectOutputStream(fout);
   bout.writeObject(s);
   bout.flush();
   bout.close();
  }
  catch (IOException e)
  {
   e.printStackTrace();
  }
 }

 // 將寫入的對象讀出
 public static void Input(String path)
 {
  File f = new File(path);
  FileInputStream fin = null;
  ObjectInputStream bin = null;
  try
  {
   fin = new FileInputStream(f);
   bin = new ObjectInputStream(fin);
   Student s = (Student) bin.readObject();
   System.out.println(s.num + "..." + s.name + "..." + s.address + "..." + s.wifeName);
  }
  catch (Exception e)
  {
   e.printStackTrace();
  }
 }

 // writeObject和readObject是線程安全的,傳輸過程中不允許被並發訪問,故對象能不斷傳來
 public static void main(String[] args) throws URISyntaxException
 {
  String path = FileInputAndOutputStream.class.getClassLoader().getResource("對象文檔.txt").toURI().getPath();
  Output(path);
  Input(path);
 }

}

@SuppressWarnings("serial")
class Student implements Serializable
{
 int num = 1;
 String name = "xy";
 String address = "goodPlace";
 transient String wifeName = "nobody";
}


二 序列化的注意點

注意點1
如果某個類能夠被序列化,其子類也可以被序列化。如果該類有父類,則分兩種情況來考慮,如果該父類已經實現了可序列化接口。 則其父類的相應字段及屬性的處理和該類相同;如果該類的父類沒有實現可序列化接口,則該類的父類所有的字段屬性將不會序列化。


注意點2
聲明為static和transient類型的成員數據不能被序列化。因為static代表類的狀態,transient代表對象的臨時數據。


注意點3
在java.io包提供的涉及對象的序列化的類與接口有

ObjectOutput接口
該接口繼承DataOutput接口並支持對象的序列化,其writeObject()方法實現存儲一個對象。

ObjectInput接口
該接口繼承DataInput接口並支持對象的序列化,其readObject()方法實現讀取一個對象。

ObjectOutputStream類
該類繼承OutputStream類並實現ObjectOutput接口,可調用接口中的writeObject方法。

ObjectInputStream類。
該類繼承InputStream類並實現ObjectInput接口,可調用接口中的readObject方法。


注意點4
對於父類的處理時,若父類沒有實現序列化接口,則其必須有默認的構造函數,否則編譯的時候就會報錯。在反序列化的時候,默認構造函數會被調用。若把父類標記為可以序列化,則在反序列化的時候,其默認構造函數不會被調用。因為Java對序列化的對象進行反序列化的時候,直接從流裏獲取其對象數據來生成一個對象實例,而不是通過其構造函數來完成。

 


參考博客:https://blog.csdn.net/yakihappy/article/details/3979373

 

最後更新:2017-04-03 16:49:28

  上一篇:go 為什麼要把jsp放在WEB-INF目錄下
  下一篇:go Oracle日期顯示問題以及trunc方法的使用