2015-02-23 101 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