0

我正在嘗試兩種不同類型實例的基本Java序列化。這是第一個Java類的類結構:當Java對象序列化時,什麼因素控制文件大小

class Ancestor { 
    int ai = 1; 
    String as = "abc"; 
} 

class DescendentSer extends Ancestor implements java.io.Serializable{ 
    int diser = 2; 
    String dsser = "xyz"; 

    @Override 
    public String toString(){ 
     return diser + " " + dsser + " " +ai+" "+as ; 
    } 
} 

我嘗試序列「DescendentSer」通過下面的代碼片段:

FileOutputStream fos = new FileOutputStream("C:\\CoreCod\\serial.dat"); 
ObjectOutputStream oos = new ObjectOutputStream(fos); 
oos.writeObject(new DescendentSer()); 
oos.flush(); 
oos.close(); 

當序列完成「serial.dat」的大小文件恰好是117個字節。然後我嘗試序列另一個實例,其類結構如下:

class IndDescendentSer implements java.io.Serializable{ 
    int diser = 2; 
    String dsser = "xyz"; 

    @Override 
    public String toString(){ 
     return diser + " " + dsser ; 
    } 
} 

的序列化代碼序列化「IndDescendentSer」是完全一樣上面(除了文件名到其中的對象實例會序列化和要序列化的實例已從之前改變)。但是,這次序列化文件的大小恰好是120個字節。

這次可能是這個時候,這個序列化文件中包含的字節多於舊的字節,特別是當「IndDescendentSer」的實例是Object類的直接後代時,而「DescendentSer」有它的超類型 - 「祖先「班。因此,預計「DescendentSer」將被更多的數據和元數據序列化。

+0

太多了,請在此處列出。類名稱,繼承深度,字段數量,字段名稱,字段內容,...請參見[對象序列化流協議](https://docs.oracle.com/javase/7/docs/platform/serialization/spec/ protocol.html)。 – EJP 2015-02-25 04:53:45

+0

@EJP在序列化過程中,我非常想知道「繼承深度」,當序列化子類型序列化時,能否詳細說明所有超類型的行爲(以線性方式),其中沒有一個是可序列化的。我試過這種情況,一切順利,我從來沒有做任何特殊方法的實現,即'private void writeObject(java.io.ObjectOutputStream out) throws IOException private void readObject(java.io.ObjectInputStream in) 拋出IOException,ClassNotFoundException;'請解釋,預先感謝。 – 2015-02-28 12:03:00

回答

1

我認爲這是在名稱。一個字符存儲在一個字節中,而最後一個類的名字多了3個字母,多3個字節。請注意,這可能是巧合,因爲我對序列化並不熟悉。

序列化是關於存儲的一個實例,它只與該類的變量有關,因爲它們決定了類的狀態。當變量加載時,實例是相同的,因爲它與當前變量相同,這就是我們想要的。

+0

確實看起來類名是額外的3個字節。因此,談到實際的主題問題時,什麼因素決定了Java對象序列化時的實際文件大小。 – 2015-02-23 19:23:15

+0

最後一段沒有多大意義。嘗試重新說明它。 – EJP 2015-02-25 03:16:07