因此,我已经声明了两个类是静态的(通过使它们的方法和构造函数私有),Synchronizer和UserProfile。Synchronizer的saveData()函数调用UserProfile的saveData()函数:
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();
}
}
Synchronizer和UserProfile都实现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
此行中的对象obj
oos.writeObject(obj);
似乎是问题所在,而不是您的UserProfile
或Synchronizable
类。我认为它不可序列化。从您的异常消息来看,我猜它的类型是org.jsoup.nodes.Document
,它不实现Serializable
。
必须可序列化的不是用于序列化对象的类,而是序列化的对象本身。在这种情况下,data
(类型为org.jsoup.nodes.Document
)引用的对象必须是可序列化的,因为它是序列化并存储在文件中的对象的状态。
使实用程序类可序列化是没有意义的:您永远不会创建它们的实例,因此永远不会序列化这些不存在的实例。
打个比方,当你想寄一封信时,你会在信上贴上邮票,因为这就是你要寄的。您的代码试图通过在邮递员身上贴邮票来发送信件。
org.jsoup.nodes.Document
)未实现Serializable,因此正在抛出NotSerializableException
。
确保您的数据对象实现了Serializable,您的错误就会消失。在这种情况下,这可能是不可能的,因为对象来自第三方库,所以您可能想看看对象是否可以转换为另一种格式进行序列化(文档可能有某种导出或转换方法)。
您可以简单地调用Document.toString()
来获得文档的可串行化字符串表示,假设它生成了一个可由Jsoup.parse(String)
读取的无损且适当解析的字符串。
例如
public static void saveData(Document document, File file)
{
String html = document.toString();
...
oos.writeObject(html);
...
}
用于进行序列化的类是可序列化的,这毫无意义。它是要保存到必须实现可序列化的文件中的对象。您并没有试图保存实用程序类,只是使用它们来实现要持久化的对象的序列化。