Сериализация
Тема дорожной карты · Java
Java Serialization — это встроенный JVM-механизм для преобразования графа объектов в поток байтов, который можно сохранить на диск, передать по сети или сохранить в кэше, и впоследствии восстановить через десериализацию в эквивалентный живой объект. Класс принимает участие в Java Serialization, реализуя маркерный интерфейс java.io.Serializable; JVM затем использует рефлексию для сериализации всех не-transient, не-static полей, а константа serialVersionUID контролирует совместимость версий между определениями JDK-классов. ObjectOutputStream.writeObject(obj) и ObjectInputStream.readObject() — низкоуровневые API Java Serialization, однако большинство современных Java-приложений предпочитают высокоуровневые библиотеки сериализации — Jackson для JSON, Protobuf, Kryo или FST, — которые быстрее, компактнее, версионированы по схеме и свободны от хорошо задокументированных уязвимостей безопасности нативной Java Serialization (выполнение произвольного кода через цепочки гаджетов десериализации). Java Serialization взаимодействует с проектированием JPA-сущностей: сущности Hibernate, реализующие Serializable, обеспечивают кэширование второго уровня и репликацию распределённых сессий, но разработчики должны помечать ленивозагружаемые коллекции как transient или предоставлять пользовательские методы readObject/writeObject для избежания сериализации неинициализированных прокси. Понимание Java Serialization — её протокола, подводных камней (NotSerializableException, InvalidClassException) и более безопасных современных альтернатив — остаётся обязательным для Java-разработчиков, обслуживающих унаследованные системы, проектирующих распределённые кэши и защищающих JVM-приложения от атак десериализации.
Как это работает
Сериализация имеет java.io (legacy блокирующие потоки: InputStream, OutputStream, Reader, Writer) и java.nio (современные channels + buffers, non-blocking, Path API). Для file I/O предпочитайте NIO Path API (Files.readString(path), Files.write(path, content), Files.lines(path).forEach(...)). Для сетевых сокетов NIO Channels + Selectors дают non-blocking I/O на масштабе. Async file I/O — через AsynchronousFileChannel. HTTP-клиент (java.net.http.HttpClient, с 11) reactive-aware.
Когда применять
Для файлов — всегда Files.*-методы: лаконично, современно, по дефолту UTF-8. Для HTTP — java.net.http.HttpClient лучше Apache HttpClient или legacy HttpURLConnection. Для сетевых серверов фреймворки (Netty, Vert.x) абстрагируют NIO. Reader/Writer — для текста, InputStream/OutputStream — для бинаря; всегда указывайте charset (StandardCharsets.UTF_8).
Типичные ошибки
Ловушки Сериализация: не закрытые streams (ресурсная утечка — try-with-resources); platform-default charset (Windows тихо cp1252); чтение огромных файлов через readAllBytes (OOM — стримите); блокирующий I/O на main-thread однопоточного app-сервера (UI замораживается / latency запросов растёт).