2014-09-25 3 views
3

статистик Java спецификации, чтоТот же идентификатор версии для всех классов?

сериализация во время выполнения ассоциирует с каждым сериализуемым классом а номер версии, называется serialVersionUID, который используется во время десериализации, чтобы убедиться в том, что отправитель и получатель сериализованного объекта, загруженные классы для этого объекта, которые совместимы с в отношении сериализации. Если приемник загрузил класс для объекта , у которого есть другой идентификатор serialVersionUID, чем у соответствующего класса отправителя , тогда десериализация приведет к InvalidClassException. enter code here

Но если я задаю все классы одинаковый серийный номер версии следующим

static final long serialVersionUID = 1L; 

Теперь все мои классы будут иметь такой же serialversionUID, и это никогда не приведет к InvalidclassException.

Я знаю, что мы даем его явно, чтобы его значение оставалось постоянным в разных реализациях JVM.

Пожалуйста, дайте мне знать, что такое использование одинакового идентификатора для всех классов и что произойдет, если мы изменим класс между сериализацией и десериализацией?

+0

Это действительно используется и полезно в среде кластера, где по умолчанию 'serialVersionUID' будет разные (по умолчанию), если каждый узел в кластере должен самостоятельно создавать программное обеспечение или узлы, необходимые для работы с несколькими версиями программного обеспечения. –

ответ

2

Я считаю, что serialVersionUID используется только для определения версии этого класса, который был сериализация - имя класса всегда присутствует тоже, так что это не приведет к какой-либо двусмысленности.

Пожалуйста, дайте мне знать, что использование сдачи же идентификатор для всех классов

Они эффективно несвязанные значения. Это просто использовать 1 и увеличивать его каждый раз, когда вы делаете нарушение.

Что произойдет, если мы изменим класс между сериализацией и десериализацией?

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

Возможно, вы захотите использовать формат двоичных данных, который будет немного приятнее при изменении формата данных, например Protocol Buffers. (Есть и другие преимущества, такие как переносимость и скорость - и protobuf - не единственная игра в городе.)

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