Javafx SimpleStringProperty бросить десериализацию IllegalStateException: непрочитанные данные блока - PullRequest
0 голосов
/ 28 мая 2019

Я занимаюсь разработкой приложения с использованием javafx.Я должен сохранить свои данные в файл.Я использую сериализацию, но так как я использую SimpleStringProperty, у меня есть проблема.SimpleStringProperty не сериализуем, поэтому я создал два метода writeObject и readObject.Метод записи работает хорошо (я думаю, что запись в файл), но чтение не делает.Когда я прочитал файл сохранения, я получил

java.lang.IllegalStateException: unread block data throwed.

A class diagram of my data

Вот диаграмма классов моих данных.Я пытаюсь спасти сотрудника.

    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)

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

Хорошо, чего мне не хватало, так это того, что при вызове readObject объект не инициализируется, поэтому readObject действует как конструктор. Все SimpleProperties, где null и firstname.set(s.readUTF()); выдавали исключение нулевого указателя.

0 голосов
/ 29 мая 2019

Вы можете использовать обычный pojo без свойств javafx, Это может даже помочь вам использовать фреймворки. Есть простые обходные пути. Когда они должны быть преобразованы в свойства. Тем не менее, это рабочий пример десериализации свойств javafx https://gist.github.com/james-d/a7202039b00170256293

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...