1

所以,我有两个声明为静态的类(通过将它们的方法设为静态并将它们的构造函数设为私有),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
4

4 回答 4

3

obj此行中的对象

oos.writeObject(obj);

似乎是问题,而不是您的UserProfileSynchronizable课程。我认为它不是可序列化的。从您的异常消息来看,我猜它是 type org.jsoup.nodes.Document,它没有实现Serializable

于 2013-08-01T20:02:56.977 回答
1

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

使您的实用程序类可序列化没有意义:您永远不会创建它们的实例,因此永远不会序列化这些不存在的实例。

打个比方,当你想寄信时,你在信上贴上邮票,因为那是寄来的。您的代码尝试通过在邮递员上贴邮票来发送一封信。

于 2013-08-01T20:00:57.547 回答
0

NotSerializableException被抛出是因为您尝试保存的某些数据()org.jsoup.nodes.Document没有实现可序列化。

确保您的数据对象实现了 Serializable 并且您的错误将消失。在这种情况下,这可能是不可能的,因为对象来自第 3 方库,因此您可能想查看是否可以将对象转换为另一种格式以进行序列化(文档可能具有某种导出或转换方法) .

您可以简单地调用Document.toString()以获取文档的可序列化字符串表示形式,假设它生成一个无损且可适当解析的字符串,该字符串可由Jsoup.parse(String).

例如

public static void saveData(Document document, File file)
{
    String html = document.toString();
    ...
    oos.writeObject(html);
    ...
}
于 2013-08-01T20:01:09.873 回答
0

用于进行序列化的类是可序列化的,这没有任何意义。它是您保存到必须实现可序列化的文件的对象。您不是在尝试保存您的实用程序类,您只是在使用它们来实现您尝试持久化的对象的序列化。

于 2013-08-02T04:34:37.947 回答