Что такое serialVersionUID и почему я должен его использовать? - PullRequest
2759 голосов
/ 13 ноября 2008

Eclipse выдает предупреждения, если отсутствует serialVersionUID.

Сериализуемый класс Foo не объявляет статический финал Поле serialVersionUID типа long

Что такое serialVersionUID и почему это важно? Пожалуйста, покажите пример, где отсутствие serialVersionUID вызовет проблему.

Ответы [ 24 ]

6 голосов
/ 03 августа 2015

Этот вопрос очень хорошо задокументирован в Effective Java Джошуа Блохом. Очень хорошая книга, которую нужно прочитать. Я изложу некоторые из причин ниже:

Среда выполнения сериализации имеет номер, называемый последовательной версией, для каждого сериализуемого класса. Этот номер называется serialVersionUID. Теперь за этим числом стоит некоторая математика, и она основана на полях / методах, определенных в классе. Для одного и того же класса каждый раз генерируется одна и та же версия. Этот номер используется во время десериализации для проверки того, что отправитель и получатель сериализованного объекта загрузили классы для этого объекта, которые совместимы в отношении сериализации. Если получатель загрузил класс для объекта, который имеет serialVersionUID, отличный от класса соответствующего отправителя, то десериализация приведет к исключению InvalidClassException.

Если класс сериализуем, вы также можете явно объявить свой собственный serialVersionUID, объявив поле с именем "serialVersionUID", которое должно быть статическим, конечным и иметь тип long. Большинство IDE, таких как Eclipse, помогают вам генерировать эту длинную строку.

2 голосов
/ 17 января 2019

Простое объяснение:

  1. Сериализуете ли вы данные?

    Сериализация - это запись данных класса в файл / поток / и т. Д. Десериализация читает эти данные обратно в класс.

  2. Намерены ли вы начать производство?

    Если вы просто тестируете что-то с неважными / фальшивыми данными, не беспокойтесь об этом (если только вы не тестируете сериализацию напрямую).

  3. Это первая версия?

    Если это так, установите serialVersionUID=1L.

  4. Это вторая, третья и т. Д. Версия продукта?

    Теперь вам нужно побеспокоиться о serialVersionUID, и вам стоит углубиться в это.

Как правило, если вы не обновите версию правильно, когда вы обновляете класс, который вам нужен для записи / чтения, вы получите сообщение об ошибке при попытке прочитать старые данные.

0 голосов
/ 29 апреля 2019

Во-первых, чтобы ответить на ваш вопрос, когда мы не объявляем SerialVersionUID в нашем классе, среда выполнения Java генерирует его для нас, но этот процесс чувствителен ко многим метаданным класса, включая количество полей, тип полей, модификатор доступа к полям. интерфейс реализован классом и т. д. Поэтому рекомендуется объявить его самостоятельно, и Eclipse предупреждает вас об этом.

Сериализация: Мы часто работаем с важными объектами, чье состояние (данные в переменных объекта) настолько важно, что мы не можем рискнуть потерять его из-за сбоев питания / системы (или) сбоев сети в случае отправки состояния объекта на другую машину. Решение этой проблемы называется «Постоянство», что просто означает сохранение (хранение / сохранение) данных. Сериализация является одним из многих других способов достижения постоянства (путем сохранения данных на диск / в память). При сохранении состояния объекта важно создать идентичность для объекта, чтобы иметь возможность правильно прочитать его обратно (десериализация). Этот уникальный идентификатор ID является SerialVersionUID.

0 голосов
/ 15 апреля 2019

Короче говоря, это поле используется для проверки правильности десериализации сериализованных данных. Сериализация и десериализация часто выполняются разными копиями программы - например, сервер преобразует объект в строку, а клиент преобразует полученную строку в объект. Это поле говорит о том, что оба оперируют одинаковыми представлениями о том, что это за объект. Это поле помогает, когда:

  • у вас есть много разных копий вашей программы в разных местах (например, 1 сервер и 100 клиентов). Если вы измените свой объект, измените свой номер версии и забудете обновить один из этих клиентов, он будет знать, что он не способен к десериализации

  • вы сохранили свои данные в каком-то файле, и позже вы попытаетесь открыть их с обновленной версией вашей программы с измененным объектом - вы будете знать, что этот файл не совместим, если вы сохраните правильную версию

Когда это важно?

Самое очевидное - если вы добавите некоторые поля к вашему объекту, более старые версии не смогут их использовать, потому что у них нет этих полей в их объектной структуре.

Менее очевидно - при десериализации объекта поля, которые не представлены в строке, будут сохранены как NULL. Если вы удалили поле из вашего объекта, более старые версии будут сохранять это поле как всегда-NULL, что может привести к неправильному поведению, если более старые версии полагаются на данные в этом поле (в любом случае вы создали его для чего-то, а не просто для удовольствия :-))

Наименее очевидно - иногда вы меняете идею, которую вы вкладываете в значение некоторого поля. Например, когда вам 12 лет, вы подразумеваете «велосипед» под словом «велосипед», но когда вам 18 лет, вы имеете в виду «мотоцикл» - если ваши друзья пригласят вас на «поездку на велосипеде по городу», и вы будете единственным, кто Приехав на велосипеде, вы поймете, как важно сохранять одинаковое значение в разных областях: -)

...