Стандартная сериализация Java при всей своей гибкости обладает рядом проблем.
Дефолтная сериализация фактически
добавляет все приватные поля в экспортируемый интерфейс, и ограничивает будущую гибкость реализации. От этого спасает
serialization proxy.
Десериализация
работает как скрытый конструктор, мимо настоящего, который обеспечивает консистентность состояния. Не сработают даже инициализаторы: поле, определенное как
int foo=42, после десериализации будет хранить значение
0.
Сериализация
усложняет тестирование – между разными версиями класса должна соблюдаться
семантическая совместимость. Эта проблема актуальна для любой реализации персистентного хранения объектов.
Неаккуратно определенная десериализация
создает дыры в безопасности. Например, сериализация объекта со слишком глубоким графом объектов-полей может привести к
StackOverflowError. Злоумышленник положит вашу систему, подставив такой искусственный объект. Для защиты от различных уязвимостей в Java 8 добавлен
механизм сериализационного фильтрования.
Встроенная реализация сериализует все классы одинаково хорошо. Естественно, за универсальность нужно платить, и для каждого частного случая
производительность не идеальна и может быть улучшена частной реализацией.