淺談物件中的成員序列化問題
阿新 • • 發佈:2018-12-30
Java物件序列化時參與序列化的內容包含以下幾個方面。
第一、屬性,包括基本資料型別、陣列以及其他物件的應用。
第二、類名。
不能被序列化的內容有以下幾個方面。
第一、方法。
第二、有static修飾的屬性。
第三、有transient修飾的屬性。
在序列化過程中不僅保留當前類物件的資料,而且遞迴儲存物件引用的每個物件的資料。將整個物件層次寫入位元組流中,這也就是序列化物件的“深複製”,即複製物件本身及引用的物件本身。序列化一個物件將可能得到整個物件序列。
在序列化過程中,由於有些屬性值比較敏感(例如密碼),或者有些屬性值的資訊量比較大,它們不需要在網路中傳遞或在磁碟中儲存,即不需要參與序列化。對於此類屬性只需要在定義時為其新增transient關鍵字即可,對於transien屬性序列化機制會跳過而不會將其寫入檔案,但在讀取時也不可被恢復,該屬性值保持預設初始化值。
我簡單的寫了個程式碼,如下:
第二、對Picture物件進行讀寫操作
通過上述測試可知,url屬性被transient關鍵字修飾時,該屬性值不會參與檔案的讀寫操作。而被static關鍵字修飾的length、width也沒有參與序列化過程。
第一、屬性,包括基本資料型別、陣列以及其他物件的應用。
第二、類名。
不能被序列化的內容有以下幾個方面。
第一、方法。
第二、有static修飾的屬性。
第三、有transient修飾的屬性。
在序列化過程中不僅保留當前類物件的資料,而且遞迴儲存物件引用的每個物件的資料。將整個物件層次寫入位元組流中,這也就是序列化物件的“深複製”,即複製物件本身及引用的物件本身。序列化一個物件將可能得到整個物件序列。
在序列化過程中,由於有些屬性值比較敏感(例如密碼),或者有些屬性值的資訊量比較大,它們不需要在網路中傳遞或在磁碟中儲存,即不需要參與序列化。對於此類屬性只需要在定義時為其新增transient關鍵字即可,對於transien屬性序列化機制會跳過而不會將其寫入檔案,但在讀取時也不可被恢復,該屬性值保持預設初始化值。
我簡單的寫了個程式碼,如下:
第一、定義序列化型別Picture
public class Picture implements Serializable { private static final long serialVersionUID = 1L; private String name; private String category; private transient String url; private static int width; private static int length; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public static int getWidth() { return width; } public static void setWidth(int width) { Picture.width = width; } public static int getLength() { return length; } public static void setLength(int length) { Picture.length = length; } @Override public String toString() { return "圖片名稱:" + name + ", 圖片類別:" + category + ", URL=" + url + ", 長=" + length + ", 寬=" + width; } }
第二、對Picture物件進行讀寫操作
/** * 在main方法中,如果同時執行write()和read(),則結果為=======圖片名稱:baby, 圖片類別:Portraits, URL=null, 長=128, 寬=256<br/> * 如果先執行write(),在執行read(),則結果為=======圖片名稱:baby, 圖片類別:Portraits, URL=null, 長=0, 寬=0 * @author gsucbiao * * @date 2011-9-5 && 下午11:41:55 */ public class InputAndOutputPicture { public static void main(String[] args) { InputAndOutputPicture ps = new InputAndOutputPicture(); try { // ps.write(); ps.read(); } catch (Exception e) { e.printStackTrace(); } } private void read() { FileInputStream fis = null; ObjectInputStream ois = null; try { fis = new FileInputStream("E://picture.txt"); ois = new ObjectInputStream(fis); Picture picture = (Picture) ois.readObject(); System.out.println("=======" + picture.toString()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { try { fis.close(); ois.close(); } catch (IOException e) { e.printStackTrace(); } } } private void write() { FileOutputStream fos = null; ObjectOutputStream oos = null; try { fos = new FileOutputStream("E://picture.txt"); oos = new ObjectOutputStream(fos); Picture picture = new Picture(); picture.setName("baby"); picture.setCategory("Portraits"); picture.setUrl("http://www.snakespirit.picture/baby.jpg"); picture.setLength(128); picture.setWidth(256); oos.writeObject(picture); oos.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { fos.close(); oos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
通過上述測試可知,url屬性被transient關鍵字修飾時,該屬性值不會參與檔案的讀寫操作。而被static關鍵字修飾的length、width也沒有參與序列化過程。