NotSerializableException с java.awt.geom.Area

Я создаю игру, в которой все местоположения «блоков» хранятся в переменной 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 (без каких-либо сторонних инструментов).
  • Есть ли другой способ сохранения информации об объекте во внешний источник, который я мог бы использовать вместо обработки файлов?

ИЗМЕНИТЬ - я также должен упомянуть, что мой класс реализует Serializable


person Robo Mop    schedule 01.03.2019    source источник


Ответы (1)


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

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

person aglassman    schedule 04.03.2019
comment
Я бы предложил либо выяснить способ чтения Area в объект, который действительно реализует Serializable, я знаю об этом и пытался создать класс MA, расширяющий Area и реализующий Serializable, но безрезультатно. - person Robo Mop; 04.03.2019
comment
Что касается читабельности, в ней нет необходимости, потому что block_area будет генерироваться почти случайным образом, и чтение для меня бесполезно. - person Robo Mop; 04.03.2019
comment
Тем не менее, +1 от меня за время, которое вы вложили в это, и, вероятно, это моя вина, что я слишком ленив, чтобы узнать что-то новое, например, JSOn прямо сейчас :) - person Robo Mop; 04.03.2019
comment
Взгляните на это: stackoverflow.com/ questions / 2644172 / - person aglassman; 05.03.2019