一:什麼是序列化?
當兩個進程在進行遠程通信時,彼此可以發送各種類型的數據。無論是何種類型的數據,都會以二進制序列的形式在網絡上傳送。發送方需要把這個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