java.io.NotSerializableException для неизвестных классов

Я пытаюсь сделать свои классы сериализуемыми. Все мои классы есть, но все равно выдает NotSerializableException для некоторых других классов, которые я не могу найти (например, com.sun.java.swing.plaf.windows.XPStyle, WClipboard).

Что я могу сделать и как обойти эти классы при сериализации или сделать их сериализуемыми?

РЕШЕНО

Проблема была в LookAndFeel, который я использовал в своих JFrames и JDialogs (проблема с XPStyle). Второй (WClipboard), он использовался сторонним классом, который я получил отсюда. Этот класс использует буфер обмена.

Я сделал поле буфера обмена transient и LookAndFeel, которым я не мог управлять, просто удалив его.


person Aleksandar    schedule 28.06.2015    source источник
comment
Как правило, классы, связанные с пользовательским интерфейсом (такие как XPStyle и WClipboard), намеренно делаются несериализуемыми, поскольку они могут взаимодействовать со специфическими для ОС (т. е. собственными) объектами, которые не могут быть сериализованы.   -  person ControlAltDel    schedule 29.06.2015
comment
Это часто возникает, когда вы используете внутренние классы, которые сериализуемы и вложены в классы, расширяющие компоненты Swing. Внутренний класс сериализует внешний класс вместе с собой, даже если это не было вашим намерением. Решение: статическое.   -  person user207421    schedule 29.06.2015
comment
Пожалуйста, взгляните на мой комментарий в следующем ответе. Я знаю причину, но не знаю решения :-)   -  person Aleksandar    schedule 29.06.2015


Ответы (1)


Если вы не хотите, чтобы данные были сериализованы для сохранения или передачи, вы можете объявить эти transient

Однако, если вам нужно, чтобы данные в этих объектах (классах) сохранялись, переносились через TCP/UDP и т. д., вам может понадобиться extend класс и реализовать его собственную интерпретацию, чтобы вы могли затем объявить свой расширенный класс Serializable.


Последним вариантом может быть использование другого метода Serialization, например, предоставляемого FST, Kryo и т. д. Часто эти библиотеки сериализации могут использовать Reflection для сериализации объектов, которые реализация Java по умолчанию не может.

person Brandon Ragland    schedule 28.06.2015
comment
Я не знаю, кто вообще использует этот класс. Я знал это, я бы посоветовал, но как сделать его временным или расширить, если я никогда не импортировал (даже напрямую) ни один из этих классов? - person Aleksandar; 29.06.2015
comment
Исходя из того, что вы опубликовали, com.sun.java.swing.plaf.windows.XPStyle - это стиль, и вы, скорее всего, применяете стиль при запуске для своего Swing JFrame в init() или основном классе. Лучше всего найти и определить, где задается этот стиль, и убедиться, что вы не создаете объект, прежде чем задавать стиль. Если вы создаете объект, вам нужно пометить его переходным. В противном случае то, что было сказано ранее, вероятно, является вашим лучшим вариантом: сделайте его статическим. - person Brandon Ragland; 29.06.2015