2017-02-22 8 views
0

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

What is a serialVersionUID and why should I use it? не указывает, почему парень, осуществивший этот меканизм, выбрал его как долгое значение.

+0

Возможный дубликат [Что такое serialVersionUID и зачем его использовать?] (Http://stackoverflow.com/questions/285793/what-is-a-serialversionuid-and-why-should-i-use- это) – Akshay

+0

В нем не указано, почему мы должны иметь большое значение. – javadev

ответ

1

Тип serialVersionUID должен быть long, так как он был указан. См. http://docs.oracle.com/javase/8/docs/platform/serialization/spec/class.html (в частности, раздел 4.6).

Причина, по которой UID составляет 64 бита, заключается в том, что риск случайного столкновения с UID будет слишком высоким, если (скажем) были использованы 32-битные значения.

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

Если были использованы 32-битные UID, вероятность того, что два несовместимых класса имеют одинаковый UID, будет одним из 2 . Это примерно один шанс в 4 миллиарда. Это слишком большой шанс. С 64-битными значениями UID изменение равно одному из 2 . Это примерно один шанс в 16 квадриллионов. Это считалось (дизайнерами) приемлемой малой вероятностью.