關於對象序列化的問題


一:什麼是序列化

        當兩個進程在進行遠程通信時,彼此可以發送各種類型的數據。無論是何種類型的數據,都會以二進制序列的形式在網絡上傳送。發送方需要把這個Java對象轉換爲字節序列,才能在網絡上傳送;接收方則需要把字節序列再恢復爲Java對象。 
  把Java對象轉換爲字節序列的過程稱爲對象的序列化。
       把字節序列恢復爲Java對象的過程稱爲對象的反序列化。

二:序列化的用途

     對象的序列化主要有兩種用途:
  1) 把對象的字節序列永久地保存到硬盤上,通常存放在一個文件中;
  2) 在網絡上傳送對象的字節序列。

三:序列化的條件

     只有實現了Serializable和Externalizable接口的類的對象才能被序列化。Externalizable接口繼承自Serializable接口,實現Externalizable接口的類完全由自身來控制序列化的行爲,而僅實現Serializable接口的類可以採用默認的序列化方式 。

四:代碼測試

1.首先創建一個Java對象,比如User對象,有兩個屬性username和password,user對象實現Serializable接口。

代碼如下:

import java.io.Serializable;


public class User implements Serializable{
   private String username;
   private String password;
public User(String username, String password) {
	 this.username=username;
	   this.password=password;
}
public String getUsername() {
	return username;
}
public void setUsername(String username) {
	this.username = username;
}
public String getPassword() {
	return password;
}
public void setPassword(String password) {
	this.password = password;
} 
    @Override
  public String toString(){
	 return "username="+username+"password="+password;  
  }
}

2.創建一個測試類,測試類將對象進行序列化,並進行轉換成String類型,進行保存。

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;


public class Test {

	/**
	 * @param args
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 * @throws ClassNotFoundException 
	 */
	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
	   User user=new User("測試","abc123");
	   byte[] a=Test.serializeObject(user);
	   /**
	    * 這裏可以將對象序列化後的字節碼轉換成String類型,
	    * 然後可以插入到數據庫中,實現java對象序列化保存到數據庫,
	    * 編碼格式最好選擇ISO-8859-1。
	    */
	   String s=new String (a,"ISO-8859-1");
	   System.out.println("a="+a);
	   /**
	    * 將string轉換成byte[]數組,也需要傳入編碼格式的參數。
	    */
	   byte[] b=s.getBytes("ISO-8859-1");
	   System.out.println("b="+b);
	   /**
	    * 將得到的byte[]數組傳入反序列化方法中,得到返回的user對象。
	    */
	   User sa=(User)Test.deserializeObject(b);
	   System.out.println(sa.getUsername()+sa.getPassword());
	}
	 /** 序列化對象
     * @throws IOException */
	  public static byte[] serializeObject(Object object) throws IOException{
	       ByteArrayOutputStream saos=new ByteArrayOutputStream();
	       ObjectOutputStream oos=new ObjectOutputStream(saos);
	       oos.writeObject(object);
	       oos.flush();
	       return saos.toByteArray();
	    }
	   
	    /** 反序列化對象
	     * @throws IOException
	     * @throws ClassNotFoundException */
	    public static Object deserializeObject(byte[]buf) throws IOException,ClassNotFoundException{
	       Object object=null;
	       ByteArrayInputStream sais=new ByteArrayInputStream(buf);
	       ObjectInputStream ois = new ObjectInputStream(sais);
	       object=(User) ois.readObject();
	       return object;
	    }

}

3.測試結果如下

a=[B@60aeb0
b=[B@66848c
測試abc123



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章