java中的序列化

jeanron100發表於2015-03-04
java中的序列化是一個很有意思的介面,只需要宣告而無需做額外的工作,但是在虛擬機器內部卻做了大量的工作保證了這一特點。只要物件實現了序列化介面,就會把它轉換為一個位元組序列,當需要的時候能夠把這個位元組序列完全恢復為原來的物件。這一過程是可以透過遠端呼叫,網路進行,所以說從某種程度而言,序列化能夠實現輕量級的持久化。

我們透過一個簡單的程式來模擬說明,
假設我們需要列印張大爺的銀行流水資訊。
我們定義一個銀行流水類,存錢類,取錢類
這裡存錢的過程我們可以理解為序列化。
取錢的過程我們可以理解為反序列化。
這兩個過程在這個例子中式完全獨立的。

銀行流水類

點選(此處)摺疊或開啟

  1. import java.io.Serializable;

  2. public class Bank_Transaction implements Serializable {
  3.     
  4.     private String customer_name;
  5.         
  6.     private double amount ;

  7.     public String getCustomer_name() {
  8.         return customer_name;
  9.     }

  10.     public void setCustomer_name(String customer_name) {
  11.         this.customer_name = customer_name;
  12.     }

  13.     public double getAmount() {
  14.         return amount;
  15.     }

  16.     public void setAmount(double amount) {
  17.         this.amount = amount;
  18.     }
  19.     
  20.                     
  21. }

存錢類

點選(此處)摺疊或開啟

  1. import java.io.FileOutputStream;
    import java.io.ObjectOutputStream;
      
    public class Topup {  
      
        public static void main(String[] args) throws Exception {  
            Bank_Transaction bank_trx_write = new Bank_Transaction();  
            bank_trx_write.setAmount(1005);
            bank_trx_write.setCustomer_name("Mr Zhang");


            FileOutputStream fos = new FileOutputStream("Bank_trxs",false);  
            ObjectOutputStream oos = new ObjectOutputStream(fos);  
            oos.writeObject(bank_trx_write);  
            oos.close();  
            fos.close();
            System.out.println(bank_trx_write.getCustomer_name()+" top up amount: "+bank_trx_write.getAmount());
            
        }  
      
    }  

取錢類

點選(此處)摺疊或開啟

  1. import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
      
    public class Withdraw {  
      
        public static void main(String[] args) throws Exception {  
                 
            FileInputStream fis = new FileInputStream("Bank_trxs");  
            ObjectInputStream ois = new ObjectInputStream(fis); 
            Bank_Transaction bank_trx_read; 
            bank_trx_read =(Bank_Transaction) ois.readObject();
            System.out.println(bank_trx_read.getCustomer_name()+" withdraw amount: "+bank_trx_read.getAmount());    
        ois.close();  
            fis.close();
            }
              
    }

在這個過程中,張大爺存了一筆錢,這些資訊對於取錢類是完全遮蔽的。
我們執行一下存錢類,先存入一筆錢
[ora11g@rac1 test]$ $ORACLE_HOME/jdk/bin/java Topup
Mr Zhang top up amount: 1005.0

這個時候會生成一個檔案,Bank_trxs
透過strings得到的內容如下,因為這個檔案是二進位制檔案,透過strings得到的內容還是能夠看出一些眉目來。
[ora11g@rac1 test]$ strings Bank_trxs
Bank_Transaction
amountL
customer_namet
Ljava/lang/String;xp@
Mr Zhang

這個時候我們執行取錢類來看看,取錢的時候發現當時存了1005
[ora11g@rac1 test]$ $ORACLE_HOME/jdk/bin/java Withdraw
Mr Zhang withdraw amount: 1005.0

java的這種持久化機制會在虛擬機器內部實現,反序列化也只有java自身才能實現,這也是Java的一種持久化方案吧,對於更具有互操作性的方案就是xml,畢竟xml還是通用並且普遍使用的一種檔案格式。
序列化在其它軟體中也有體現,在Hadoop中的實現據稱更加輕量級,簡便,我們在後面繼續討論。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-1448633/,如需轉載,請註明出處,否則將追究法律責任。

相關文章