2013-07-25 3 views
4

Я читаю о сериализации в java.Java говорит, что статические переменные не сериализованы с object.serialVersionUID является обязательным в процессе сериализации. Когда объект сериализуется, serialVersionUID сериализуется вместе с другим содержимым , Это одно исключение из общего правила сериализации, которое «статические поля не сериализованы»Почему SerialVersionUID является статическим

Может ли кто-нибудь сказать мне, почему это static.it может быть нестатическим?

ответ

5

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

По этой же причине UID выполнен как статический.

0

Этот serialVersionUID является соглашением для проверки того, что у вас есть те же двоичные версии как в сериализаторе, так и в десериализаторе, и с устаревшими версиями ничего не получится. Кроме того, это может быть случай, когда у вас одинаковые имена для разных классов классов в десериализаторе, так что serialVersionUID подобен уникальному идентификатору вида od.

Именно поэтому он должен быть статическим (так он «ограничен к классу, а не к каждому экземпляру) и„послал“вместе с последовательными данными.

0

Он должен быть статическим, поскольку она уполномочена JRE, чтобы он так Рассуждение может быть простой, она может быть доступна в статическом образом, фактически не создавая объект класса

от javadocs:..

сериализации во время выполнения ассоциаты с каждым сериализуемым класс a версия num ber, называемый serialVersionUID, который используется при десериализации , чтобы убедиться, что отправитель и получатель сериализованного объекта загрузили классы для этого объекта, которые совместимы с в отношении сериализации. Если приемник загрузил класс для объекта , у которого есть другой идентификатор serialVersionUID, чем у соответствующего класса отправителя , тогда десериализация приведет к InvalidClassException. Сериализуемая класс может объявить свой собственный serialVersionUID явно объявить поле с именем «serialVersionUID», который должен быть статическим, окончательным и типа длинной:

+0

не говорит почему? Я думаю, что OP любопытно узнать, почему JRE обязывает его быть статичным – sanbhat

0

Это исключение, что оно сериализуется. Я считаю, что это static, потому что он связан с классом, а не с каким-либо экземпляром класса. Все экземпляры класса должны придерживаться того же serialVersionUID. Опять же, старая статика означает, что время выполнения может фактически получить этот идентификатор без создания какого-либо объекта, тогда как предварительным условием де-сериализации объекта будет установление идентификатора. Когда объект сериализуется, имя класса, состояние объекта (нестатические переменные-члены) и serialVersionUID сохраняются.

0

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

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L; 

объявленной статичными, как ее связанным с классом, а не какие-либо функции/переменная.

1

Во-первых, вы должны понимать, что делает serialVersionUID.

От java.io.Serializable:

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

serialVersionUID определяет совместимость между различными версиями класса. Поскольку свойство связано с классом, оно должно быть сделано static.

0

serialVersionUID является статическим, поскольку он применяется не к экземпляру класса, а к самому классу. Он сохраняется в дескрипторе класса ObjectOutputStream.

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