2014-10-03 445 views
1

讀取某些對象時,我有一些非常基本的序列化代碼:`java.io.StreamCorruptedException:塊data`意外結束從文件

void serializeObjectToFile(Serializable serializable, File file) { 
    ObjectOutputStream stream = null; 
    try { 
     stream = new ObjectOutputStream(new FileOutputStream(file)); 
     stream.writeObject(serializable); 
     stream.flush(); 
    } catch (Exception exception) { 
     logger.error("Failed to serialize object: {}.", serializable, exception); 
    } finally { 
     if (stream != null) { 
      try { 
       stream.close(); 
      } catch (IOException exc) { 
       logger.error("Error closing stream.", exc); 
      } 
     } 
    } 
} 

而且還有一些很反串行化代碼:

Object deserializeObjectFromFile(File file) { 
    ObjectInputStream oiStream = null; 
    try { 
     oiStream = new ObjectInputStream(new FileInputStream(file)); 
     return oiStream.readObject(); 
    } catch (Exception exc) { 
     logger.error("Exception loading object from file '{}'.", file.getAbsolutePath(), exc); 
    } finally { 
     if (oiStream != null) { 
      try { 
       oiStream.close(); 
      } catch (IOException exc) { 
       logger.error("Error closing stream.", exc); 
      } 
     } 
    } 
    return null; 
} 

此代碼適用於大多數對象。但是,對於某些對象,我得到以下異常:

java.io.StreamCorruptedException: unexpected end of block data 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) ~[na:1.6.0_29] 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) ~[na:1.6.0_29] 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) ~[na:1.6.0_29] 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) ~[na:1.6.0_29] 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) ~[na:1.6.0_29] 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) ~[na:1.6.0_29] 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) ~[na:1.6.0_29] 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) ~[na:1.6.0_29] 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) ~[na:1.6.0_29] 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) ~[na:1.6.0_29] 
at java.util.ArrayList.readObject(ArrayList.java:593) ~[na:1.6.0_29] 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_29] 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_29] 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_29] 
at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_29] 
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974) ~[na:1.6.0_29] 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848) ~[na:1.6.0_29] 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) ~[na:1.6.0_29] 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) ~[na:1.6.0_29] 
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) ~[na:1.6.0_29] 
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) ~[na:1.6.0_29] 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) ~[na:1.6.0_29] 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) ~[na:1.6.0_29] 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) ~[na:1.6.0_29] 
at my.CustomClass.deserializeObjectFromFile(CustomClass.java:79) ~[classes/:na] 

我不嘗試序列每個文件的多個對象(通過對主題的其他問題的建議)。該代碼適用於大多數對象,但不適用於某些對象。由於ArrayList.readObject()出現在堆棧跟蹤中:這是否與問題有關?如果是這樣,什麼?令我驚訝和失望的是,我沒有在網絡上發現有關這個問題的任何信息......

我很欣賞任何關於從哪裏出發的指針......!

+1

什麼是它的一個ArrayList *?* ArrayList的本身實際上是一定不會到這裏來的罪魁禍首,而是一類自己的一個自定義的readObject()/ writeObjext()對,絕對是。 – EJP 2014-10-04 00:23:41

回答

1

我發現這個問題:一個對象的對象圖中的深跌中實現以下方法:

private void writeObject(java.io.ObjectOutputStream out) throws IOException 

沒有實際寫入其內部的ObjectOutputStream並沒有拋出異常(該方法用於實施驗證目的)。所以解決方案:在實現這種方法時,拋出某種類型的Exception或將對象的內部寫入ObjectOutputStream。最簡單的就是叫

out.defaultWriteObject();