Java 使用静态方法执行文件I/O时出现NotSerializableException

Java 使用静态方法执行文件I/O时出现NotSerializableException,java,static,io,notserializableexception,Java,Static,Io,Notserializableexception,所以,我有两个类,我声明它们是静态的(通过使它们的方法是静态的,它们的构造函数是私有的),Synchronizer和UserProfile。同步器的saveData()函数调用UserProfile的saveData()函数: private static void saveData(){ UserProfile.saveData(data, dataFile); } 这是UserProfile.saveData(…): Synchronizer和UserProfile都实现Seria

所以,我有两个类,我声明它们是静态的(通过使它们的方法是静态的,它们的构造函数是私有的),Synchronizer和UserProfile。同步器的saveData()函数调用UserProfile的saveData()函数:

private static void saveData(){
    UserProfile.saveData(data, dataFile);
}
这是UserProfile.saveData(…):

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
恢复同步数据
java.io.WriteAbortedException:写入中止;java.io.NotSerializableException:org.jsoup.nodes.Document
位于java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
位于java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1964)
位于java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1888)
位于java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
位于java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
位于java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
位于java.util.ArrayList.readObject(ArrayList.java:733)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:601)
位于java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1004)
位于java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1866)
位于java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
位于java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
位于java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
在UserProfile.restoreData(UserProfile.java:93)
在Synchronizer.restoreData(Synchronizer.java:74)
处理器处。(Processor.java:8)
在命令行。(CommandLine.java:15)
位于tunescapt.main(tunescapt.java:5)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:601)
位于org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
原因:java.io.NotSerializableException:org.jsoup.nodes.Document
位于java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180)
位于java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528)
位于java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1493)
位于java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
位于java.io.ObjectOutputStream.WriteObject 0(ObjectOutputStream.java:1174)
位于java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
位于java.util.ArrayList.writeObject(ArrayList.java:710)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:601)
位于java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)
位于java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
位于java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
位于java.io.ObjectOutputStream.WriteObject 0(ObjectOutputStream.java:1174)
位于java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
在UserProfile.saveData(UserProfile.java:80)
saveData(Synchronizer.java:87)
位于Synchronizer.addHTML(Synchronizer.java:44)
at Processor.sync(Processor.java:100)
在CommandLine.launch(CommandLine.java:99)
位于tunescapt.main(tunescapt.java:6)
... 还有5个

必须序列化的不是用于序列化对象的类,而是序列化对象本身。在这种情况下,
data
(类型为
org.jsoup.nodes.Document
)引用的对象必须是可序列化的,因为它是序列化并存储在文件中的该对象的状态

使实用程序类可序列化是没有意义的:您从未创建它们的实例,因此也从未序列化这些不存在的实例


打个比方,当你想寄信的时候,你在信上贴上邮票,因为那就是寄出的东西。您的代码试图通过在邮递员上粘贴戳记来发送信件。

必须序列化的不是用于序列化对象的类,而是序列化对象本身。在这种情况下,
data
(类型为
org.jsoup.nodes.Document
)引用的对象必须是可序列化的,因为它是序列化并存储在文件中的该对象的状态

使实用程序类可序列化是没有意义的:您从未创建它们的实例,因此也从未序列化这些不存在的实例


打个比方,当你想寄信的时候,你在信上贴上邮票,因为那就是寄出的东西。您的代码试图通过在邮递员上粘贴戳记来发送信件。

由于您试图保存的某些数据(org.jsoup.nodes.Document)未实现可序列化,因此引发了
NotSerializableException

确保您的数据对象实现了可序列化,错误就会消失。在这种情况下,这可能是不可能的,因为对象来自第三方库,因此您可能希望查看该对象是否可以转换为其他格式进行序列化(文档可能具有某种导出或转换方法)

你可能是abl
    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
public static void saveData(Document document, File file)
{
    String html = document.toString();
    ...
    oos.writeObject(html);
    ...
}
oos.writeObject(obj);