3

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

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

решаемые

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

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

+2

В общем, классы, связанные с пользовательским интерфейсом (например, XPStyle и WClipboard), намеренно не сериализуются, потому что они могут взаимодействовать с конкретными (т.е. родными) объектами, которые не могут быть сериализованы. – ControlAltDel

+0

Это часто возникает, когда вы используете внутренние классы, которые являются сериализуемыми и вложенными внутри классов, которые расширяют компоненты Swing. Внутренний класс сериализует внешний класс вместе с собой, даже если это не ваше намерение. Решение: статическое. – EJP

+0

Пожалуйста, взгляните на мой комментарий в следующем ответе. Я знаю причину, но не знаю решения :-) – Aleksandar

ответ

1

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

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


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

+0

Я не знаю, кто вообще использует эти кланы. Я знал это, я бы советовал вещи, но как сделать это преходящим или расширить его, когда я никогда не импортировал (даже напрямую) какой-либо из этих классов? – Aleksandar

+1

Отправляя то, что вы опубликовали, 'com.sun.java.swing.plaf.windows.XPStyle' - это стиль, и вы, скорее всего, применяете стиль при запуске для своего Swing JFrame в init() или main класс. Ваш лучший вариант - найти и определить, где этот стиль установлен, и убедиться, что вы не создаете объект перед установкой стиля. Если вы создаете объект, вам нужно отметить его переходный процесс. В противном случае, что было сказано ранее, вероятно, ваш лучший вариант: сделайте его статичным. –

Смежные вопросы