【问题标题】:Javafx SimpleStringProperty deserialization throw IllegalStateException: unread block dataJavafx SimpleStringProperty 反序列化抛出 IllegalStateException: 未读块数据
【发布时间】:2019-05-28 17:37:50
【问题描述】:

我正在使用 javafx 开发应用程序。我必须将我的数据保存在一个文件中。我使用序列化,但由于我使用 SimpleStringProperty 我有一个问题。 SimpleStringProperty 不可序列化,因此我创建了两个方法 writeObject 和 readObject。写方法效果很好(我认为,它写在文件中),但读方法不行。当我阅读保存文件时,我得到了

java.lang.IllegalStateException: unread block data throwed.

这是我的数据的类图。我试图保存的是员工。

    private void writeObject(ObjectOutputStream s) throws IOException
    {
        s.defaultWriteObject();
        s.writeInt(id);
        s.writeUTF(firstname.get());
        s.writeUTF(lastname.get());
        s.writeUTF(phoneNumber.get());
        s.writeBoolean(gender.get());
    }

    private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException
    {
        id = s.readInt();
        firstname.set(s.readUTF());
        lastname.set(s.readUTF());
        phoneNumber.set(s.readUTF());
        gender.set(s.readBoolean());
    }

您知道问题可能是什么吗?

java.lang.IllegalStateException: unread block data
at java.io.ObjectInputStream$BlockDataInputStream.setBlockDataMode(ObjectInputStream.java:2783)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1605)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2287)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2211)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2069)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
at java.util.ArrayList.readObject(ArrayList.java:797)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1170)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2178)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2069)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
at sample.Main.loadData(Main.java:61)
at sample.Main.start(Main.java:27)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
at java.lang.Thread.run(Thread.java:748)

【问题讨论】:

  • 您需要向我们展示您的堆栈跟踪。
  • 我编辑了我的问题 :)
  • 你调用了defaultWriteObject(),但是没有对应的defaultReadObject()
  • 嗡嗡声并不能解决问题。这是新的堆栈跟踪pastebin.com/HTJvm06M
  • s.defaultReadObject(); 必须是 readObject 方法中的第一行代码。

标签: java javafx serialization


【解决方案1】:

好的,我缺少的是当调用 readObject 时,对象没有被初始化,所以 readObject 就像一个构造函数。 null 和 firstname.set(s.readUTF()); 的所有 SimpleProperties 都引发了空指针异常。

【讨论】:

    【解决方案2】:

    你可以使用没有 javafx 属性的普通 pojo, 这甚至可以帮助您使用框架。有简单的解决方法。当它们需要转换为属性时。 但是,这是反序列化 javafx 属性的一个工作示例 https://gist.github.com/james-d/a7202039b00170256293

    【讨论】:

    • 我在你的例子中注意到我必须做 x1 = new SimpleDoubleProperty(...);而不是 x1.set(...);谢谢。
    猜你喜欢
    • 2020-03-16
    • 2020-02-07
    • 2020-04-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 2012-08-25
    相关资源
    最近更新 更多