2015-02-23 225 views
-2

我想反序列化一些存儲在.ser文件中的對象。 問題是,即使該文件包含了一些對象,我不能設法填補數據....數組列表如何反序列化一個對象?

CODE:

File file=new File(path); 
List<Row> deserialized=new ArrayList<Row>(); 
ObjectInputStream objectIn = new ObjectInputStream(new BufferedInputStream(new FileInputStream(file)));    
deserialized=(List<Row>) objectIn.readObject(); 

反序列化始終是執行後空這個。我究竟做錯了什麼?

編輯:我看到了,我得到下面的異常堆棧跟蹤:

java.io.EOFException 
at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source) 
at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source) 
at java.io.ObjectInputStream.readStreamHeader(Unknown Source) 
at java.io.ObjectInputStream.<init>(Unknown Source) 
at com.warnings.compilation.views.TableContent.getSolvedErrors(TableContent.java:1788) 
at com.warnings.compilation.views.TableContent.updateContentProvider(TableContent.java:243) 
at com.warnings.compilation.views.TableContent.updateContentProviderOnRefresh(TableContent.java:1458) 
at com.warnings.compilation.views.TabViewer$2.selectionChanged(TabViewer.java:305) 
at org.eclipse.ui.internal.AbstractPartSelectionTracker$1.run(AbstractPartSelectionTracker.java:119) 
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) 
at org.eclipse.core.runtime.Platform.run(Platform.java:857) 
at org.eclipse.ui.internal.AbstractPartSelectionTracker.fireSelection(AbstractPartSelectionTracker.java:117) 
+0

你試過調試器嗎? – Aify 2015-02-23 16:30:20

+2

你寫的代碼似乎沒問題...請提供更多詳細信息... – 2015-02-23 16:30:29

+0

你可以給一個例子什麼是.ser文件嗎? – 2015-02-23 16:30:58

回答

2

你的代碼看起來很好,應該工作IFF您正確序列化ArrayList中(例如,如果你正在讀它使用的readObject(),那麼你應該使用writeObject()對其進行序列化)

以下是序列化和反序列化ArrayList的示例。

public static void main(String[] args) throws IOException, ClassNotFoundException { 
    // create a test ArrayList 
    ArrayList<Integer> arr = new ArrayList<Integer>(); 
    for (int i = 0; i < 10; ++i) 
     arr.add(i); 

    // serialize ArrayList 
    FileOutputStream fos = new FileOutputStream("test.ser"); 
    ObjectOutputStream oos = new ObjectOutputStream(fos); 
    oos.writeObject(arr); 
    oos.close(); 

    // desrialize ArrayList 
    FileInputStream fis = new FileInputStream("test.ser"); 
    ObjectInputStream ois = new ObjectInputStream(fis); 
    ArrayList<Integer> deser = (ArrayList<Integer>) ois.readObject(); 
    ois.close(); 

    System.out.println(deser.size()); 
    for (Integer element : deser) 
     System.out.println(element); 
} 

如果代碼中的類「行」是可序列化的,那麼您的代碼應該可以工作。

+0

奇怪的是,對於另一個包含相同「行」對象但僅與名稱不同的.ser文件,反序列化函數可以工作。另外「Row」實現java.io.serializable。 – 2015-02-23 18:02:54

+0

文件名可以是任何東西。所以,你的問題是不確定的文件名。一定有另一個問題。一個缺點是,如果您忘記關閉ObjectOutputStream實例,那麼這可能會導致輸出文件損壞,因爲某些數據可能仍然不會被刷新到輸出文件。 – 2015-02-23 18:22:39

+0

我編輯了我的問題,拋出異常! – 2015-02-27 12:45:28