2013-08-01 17 views
1

因此,我有兩個聲明爲靜態的類(通過使它們的方法爲靜態,並且它們的構造函數爲private),Synchronizer和UserProfile。同步的SAVEDATA()函數調用用戶配置的SAVEDATA()函數:使用靜態方法執行文件I/O時的NotSerializableException

private static void saveData(){ 
    UserProfile.saveData(data, dataFile); 
} 

這裏是UserProfile.saveData(...):

public static void saveData(Object obj, File file){ 
    try { 
     ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file)); 
     oos.writeObject(obj); 
     oos.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

同步器和用戶配置都實現Serializable接口,並有一個自動生成的serialVersionUID。

任何幫助?我很確定我正在做一些根本性的錯誤。

編輯:這裏是輸出。

Restoring sync data 
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: org.jsoup.nodes.Document 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351) 
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1964) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1888) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) 
    at java.util.ArrayList.readObject(ArrayList.java:733) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1004) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1866) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369) 
    at UserProfile.restoreData(UserProfile.java:93) 
    at Synchronizer.restoreData(Synchronizer.java:74) 
    at Processor.<init>(Processor.java:8) 
    at CommandLine.<init>(CommandLine.java:15) 
    at TuneSnatch.main(TuneSnatch.java:5) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58) 
Caused by: java.io.NotSerializableException: org.jsoup.nodes.Document 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180) 
    at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1493) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346) 
    at java.util.ArrayList.writeObject(ArrayList.java:710) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346) 
    at UserProfile.saveData(UserProfile.java:80) 
    at Synchronizer.saveData(Synchronizer.java:87) 
    at Synchronizer.addHTML(Synchronizer.java:44) 
    at Processor.sync(Processor.java:100) 
    at CommandLine.launch(CommandLine.java:99) 
    at TuneSnatch.main(TuneSnatch.java:6) 
    ... 5 more 
+0

它意味着「數據」,無論它真的是什麼類,都是不可序列化的。 –

+0

應該是不可序列化的'org.jsoup.nodes.Document'(在'ArrayList'中)。您想要序列化的對象需要支持它,而不是啓動序列化的代碼。 – zapl

回答

2

在這一行

oos.writeObject(obj); 

的對象obj看來是問題,而不是你UserProfileSynchronizable類。我認爲這不是可序列化的。從你的異常消息來看,我猜它是org.jsoup.nodes.Document,它不實現Serializable

1

必須是可序列化的不是用於序列化對象的類,而是序列化對象本身。在這種情況下,由dataorg.jsoup.nodes.Document類型)引用的對象必須是可序列化的,因爲它是序列化並存儲在文件中的此對象的狀態。

使您的工具類可序列化沒有意義:您從不創建它們的實例,因此從不序列化這些不存在的實例。

作爲一個比喻,當你想發送一封信時,你在信上粘貼了一個印章,因爲這是發送的內容。你的代碼試圖通過在郵遞員上粘貼郵票來發送信件。

+0

+1爲您的比喻讓人想起的有趣圖片+1。 :) – ajb

0

由於您試圖保存的部分數據(org.jsoup.nodes.Document)未實現Serializable,因此將拋出NotSerializableException

確保您的數據對象實現了Serializable,並且您的錯誤將消失。在這種情況下,這可能是不可能的,因爲對象來自第三方庫,因此您可能想要查看該對象是否可以轉換爲另一種序列化格式(該文檔可能具有某種導出或轉換方法) 。

您可能只需簡單地撥打Document.toString()即可獲取文檔的可串行化字符串表示形式,假設它生成一個可由Jsoup.parse(String)讀取的無損可適當解析的字符串。

E.g.

public static void saveData(Document document, File file) 
{ 
    String html = document.toString(); 
    ... 
    oos.writeObject(html); 
    ... 
} 
0

用於序列化的類是可序列化的是沒有意義的。這是您保存到必須實現可序列化的文件的對象。你不是試圖保存你的工具類,你只是用它們來實現你試圖持久化的對象的序列化。

相關問題