Похоже, что вы сохраняете некоторый объект, к которому прикреплен этот (анонимный) ActionListener, или каким-то образом ссылаетесь на объект, который в свою очередь ссылается на этот ActionListener. ActionListener, в свою очередь, ссылается на объект fc
, который является JFileChooser
. JFileChooser сам знает свой объект пользовательского интерфейса (который выполняет всю работу таким образом, что средство выбора файлов вписывается в вашу систему), и этот объект не сериализуем.
Нет смысла сериализовать JFileChooser. Единственные интересные данные, которые он содержит, - это имя файла или каталога, которые в любом случае могут быть непригодны для использования в другой системе.
Простым решением было бы переместить fc
в метод actionPerformed и инициализировать его там (создав новый JFileChooser).
Но вы действительно хотите узнать, почему ваш ActionListener (или объект, к которому он присоединен) сериализован - это иногда может быть полезно, но, скорее всего, вы не хотите, чтобы ваш графический интерфейс вообще сериализовался, только данные. Чтобы иметь представление, измените
catch (IOException e){l2.setText(e.toString());}
до
catch (IOException e){
l2.setText(e.toString());
e.printStackTrace();
}
и посмотрите на трассировку стека из стандартного вывода. Он должен показать вам подсказку, какие объекты пытаются сериализовать. Может случиться так, что ваши Круги имеют ссылку на какой-то объект, который на самом деле не должен. (Или ссылка, которая должна быть кратковременной. Или что они являются объектами внутреннего класса, когда они не должны.)