Java---序列化與反序列化(ObjectOutputStream/ObjectInputStream)
阿新 • • 發佈:2018-12-10
一:什麼是序列化與反序列化
序列化:
- 將記憶體中的物件變為二進位制位元組流的形式進行傳輸或儲存在文字中;
- 並不是所有物件都要被序列化, 一般物件要進行傳輸需要被序列化;
- 物件若要被序列化輸出,該類需要實現Serializable介面。即只有實現Serializable介面的類才有序列化能力。
反序列化:把文字中二進位制位元組流反序列化為一個物件。
import java.io.Serializable;
public interface Serializable {
}
Serializable 接口裡什麼功能也沒有,只是一個標識介面,標識著實現Serializable 的類具有序列化功能。
實現序列化與 反序列化
實現序列化與反序列化,需要使用IO包提供的兩個類:
- ObjectOutputStream----物件位元組輸出流,不存在物件字元輸出流
- ObjectInputStream—物件位元組輸入流,不存在物件字元輸入流
物件的序列化輸出----ObjectOutputStream
public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants
構造方法:
//out指通過什麼方式進行傳輸,可以是檔案等
public ObjectOutputStream(OutputStream out) throws IOException
物件寫入方法:
//需要傳入要寫入的物件
public final void writeObject(Object obj) throws IOException
例:物件序列化
package CODE.JavaIo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
//實現Serializable介面 ,具有序列化功能
class Student implements Serializable
{
private String name; //姓名
private int sno; //學號
public Student(String name, int sno) {
this.name = name;
this.sno = sno;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sno='" + sno + '\'' +
'}';
}
}
public class Xulie {
public static void main(String[] args) throws Exception {
//1.取得終端物件
File file=new File("C:"+File.separator+"Users"+File.separator+
"lenovo"+File.separator+"Desktop"+
File.separator+"Test.txt");
//2.取得物件的輸出流,物件序列化
Student s=new Student("pick",24);
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file));
//3.物件的寫入
oos.writeObject(s);
//4.關閉流
oos.close();
}
}
物件的反序列化輸入----ObjectInputStream
public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants
構造方法:
//傳輸輸入流物件
public ObjectInputStream(InputStream in) throws IOException
物件的反序列化輸入:
//由於是從文字中讀取,需要將文字中二進位制位元組流反序列化為一個物件返回
public final Object readObject() throws IOException, ClassNotFoundException
例:物件的反序列化
package CODE.JavaIo;
import java.io.*;
public class Xulie {
public static void main(String[] args) throws Exception {
//1.取得終端物件
File file=new File("C:"+File.separator+"Users"+File.separator+
"lenovo"+File.separator+"Desktop"+
File.separator+"Test.txt");
//2.物件的輸入流,物件反序列化
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file));
//3.物件反序列化輸入
Object obj=ois.readObject(); //Student向上轉型
System.out.println(obj); //Student{name='pick', sno='24'}
//4.關閉流
ois.close();
}
}
transient關鍵字
Serializable預設將物件中所有屬性以及值進行序列化以及反序列化,如果某些屬性(密碼)不需要被序列化輸出,可以在屬性前加transient關鍵字。
class Student implements Serializable
{
private String name; //姓名
private transient int sno; //學號將不會被序列化儲存
}
反序列化物件:
System.out.println(obj); //Student{name='pick', sno='0'}
此時反序列化後的物件的sno就為預設值0。