Штраф за внедрение Serializable в Java?
Есть ли штраф за добавление
implements Serializable
для класса Java? Влияние на размер создаваемого объекта или производительности?
Ответы
Ответ 1
Стоимость близка к нулю, не стоит беспокоиться.
Дополнительная информация:
- Нет увеличения размера каждого экземпляра объекта
- Небольшое увеличение размера самого класса, но поскольку это одноразовая стоимость, это тривиально, когда амортизируется в большом количестве экземпляров.
- Может быть небольшая дополнительная стоимость исполнения для всего, что необходимо для проверки интерфейса во время выполнения (отражение, поиск instancof, дополнительное давление на встроенные кеши и т.д.). Опять же, это, вероятно, будет незначительным для большинства целей.
- Serializable - это интерфейс маркера, нет методов, которые необходимо реализовать. Другие примеры интерфейса маркера: Clonable, SingleThreadModel, прослушиватель событий.
Ответ 2
Если вы/кто-то еще не сериализует/десериализует, никакого воздействия не будет. Serializable
- это только интерфейс маркера.
Вероятно, это только увеличит размер сгенерированного байт-кода на несколько байтов.
Ответ 3
Эффект не влияет на производительность, если вы не выполняете сериализацию/десериализацию, но есть компромиссы в плане дизайна api.
Из Эффективная java от Джошуа Блоха
- Основная стоимость внедрения Serializable заключается в том, что он уменьшает гибкость для изменения реализации классов, как только он был выпустила
- Вторая стоимость реализации Serializable заключается в том, что она увеличивает вероятность ошибок и дыр в безопасности.
- Третья стоимость внедрения Serializable заключается в том, что она увеличивает нагрузку на тестирование, связанную с выпуском новой версии класса
В какой степени они применимы к вам, зависит от вашего использования.
Ответ 4
Вы всегда должны сначала учитывать затраты на обслуживание. Стоимость развернутого приложения за его живое может быть в несколько раз выше стоимости его разработки.
В этом случае стоимость создания класса Serializable, но фактически не используется для сериализации, может привести к ошибкам или путанице, намного превышающим стоимость исполнения. например скажем, требуется 1 минута или кто-то время, чтобы определить, что Serializable не требуется, это может стоить гораздо больше, чем несколько нано-секундных дополнительных стартапов, выполняемых приложением.
Если вам действительно нужно быть Serializable, вы не можете сравнить его с версией, отличной от Serializable, потому что только первый случай действительно выполнит требуемую работу.
Ответ 5
Serializable
- это просто "маркерный" интерфейс. Это не требует применения каких-либо методов.
Единственное, что рекомендуется использовать static final long serialVersionUID
, чтобы помочь API сериализации. Это стоит единственное значение long
для каждого сериализованного класса.
Возможно, вы захотите проверить эту статью о Java Serialization API. Он описывает большую часть оговорок сериализации/десериализации в деталях.