NotSerializableException с java.awt.geom.Area - PullRequest
0 голосов
/ 01 марта 2019

Я создаю игру, в которой все местоположения «блоков» хранятся в переменной block_area - объект класса Area.Моя игра работает корректно уже неделю, и я решил реализовать функцию сохранения и загрузки, в которой я сохраняю block_area в файл Drifter, с таким кодом:

Area block_area; // Later initialized

void saveArea()
{
    try
    {
        FileOutputStream fos = new FileOutputStream(savefile);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(block_area);
        oos.close();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

void loadArea()
{
    try
    {
        FileInputStream fis = new FileInputStream(savefile);
        ObjectInputStream ois = new ObjectInputStream(fis);

        block_area  = (Area)ois.readObject();

        ois.close();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

Тем не менее, это мой первый раз, когда я пишу и читаю ОБЪЕКТ в файл, поэтому я мало что знаю об этом.Когда я пытаюсь сохранить объект в файл, он выдает мне такую ​​ошибку:

java.io.NotSerializableException: java.awt.geom.Area
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
    at Drifter.saveArea(Drifter.java:58)
    at Drifter.keyPressed(Drifter.java:315)
    ...

Если кто-нибудь может сказать мне, как я могу написать и прочитать объект с файлом, помощь будет оченьприветствуется.

TL; DR Как мне записать содержимое объекта Area в файл и прочитать его?

ТАКЖЕ У меня есть несколько замечанийвопросы:

  • Является ли ObjectInputStream лучшим вариантом действий здесь?Я видел несколько ответов, в которых люди рекомендуют использовать XML и JSON, но я не могу найти время, чтобы узнать о них, и предпочел бы придерживаться метода чистой Java (без каких-либо сторонних инструментов)
  • Есть ли другой способ сохранения информации об объекте во внешний источник, который я могу использовать вместо обработки файлов?

EDIT - Я должен также упомянуть, что мойкласс реализует Serializable

1 Ответ

0 голосов
/ 04 марта 2019

Исключение самоочевидно NotSerializableException: java.awt.geom.Area.Любой объект, который вы хотите сериализовать, должен реализовывать интерфейс Serializable.java,awt.geom.Area нет.Любые атрибуты этого класса также должны реализовывать Serializable, быть примитивом или быть определены как переходные.

Я бы предложил либо выяснить способ считывания Area в объект, который реализует Serializable.Когда вы читаете его обратно, вы можете создать новый объект Area.Это, вероятно, то, что делает JSON / XML метод , упомянутый в комментариях.Дополнительным преимуществом удобочитаемого формата хранения является то, что вы можете редактировать его в текстовом редакторе.Вы не сможете сделать это с двоичным выходом сериализованного объекта`.

...