Почему генерируют длинный serialVersionUID вместо простого 1L?

Для опции XSLT 2.0 вы можете использовать атрибут separator в xsl:value-of.

Это xsl:value-of:

<xsl:value-of select="/root/item" separator=", "/>

будет выдавать этот вывод:

apple, orange, banana

Вы также можете использовать больше, чем просто запятую для разделителя. Например, это:

<xsl:text>'</xsl:text>
<xsl:value-of select="/root/item" separator="', '"/>
<xsl:text>'</xsl:text>

выдаст следующий вывод:

'apple', 'orange', 'banana'

Другой вариант XSLT 2.0 - string-join() ...

<xsl:value-of select="string-join(/*/item,', ')"/>
204
задан Buhake Sindi 5 September 2011 в 20:35
поделиться

5 ответов

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

См. Спецификацию сериализации Java для получения более подробной информации.

86
ответ дан 23 November 2019 в 04:55
поделиться

Целью UID версии сериализации является отслеживание различных версий класса для выполнения действительной сериализации объектов.

Идея состоит в том, чтобы сгенерировать идентификатор, уникальный для определенная версия класса, которая затем изменяется, когда в класс добавляются новые детали, такие как новое поле, которое может повлиять на структуру сериализованного объекта.

Всегда используется один и тот же идентификатор, например ] 1L означает, что в будущем, если определение класса будет изменено, что приведет к изменениям в структуре сериализованного объекта, возникнут проблемы при попытке десериализации объекта.

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

Вот пара ссылок на статьи, в которых обсуждается сериализация и управление версиями классов:

69
ответ дан 23 November 2019 в 04:55
поделиться

Основная причина создания сгенерированного кода - сделать его совместимым с существующая версия класса, в которой уже есть сохраненные копии.

18
ответ дан 23 November 2019 в 04:55
поделиться

«Длинное» значение по умолчанию для serialVersionUID - это значение по умолчанию, определенное в Спецификации сериализации Java , рассчитанное на основе поведения сериализации по умолчанию.

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

Если вам не нужно быть совместимым с существующими битовыми потоками, вы можете просто поместить туда 1L и при необходимости увеличивать версию при каких-либо изменениях. То есть, когда версия сериализации по умолчанию измененного класса будет отличаться от версии по умолчанию старого класса.

14
ответ дан 23 November 2019 в 04:55
поделиться

Если вы не укажете serialVersionUID, Java сделает его на лету. Сгенерированный serialVersionUID и есть этот номер. Если вы измените что-то в своем классе, что на самом деле не делает ваш класс несовместимым с предыдущими сериализованными версиями, но изменяет хэш, тогда вам нужно использовать сгенерированный serialVersionUID с очень большим числом (или "ожидаемый" номер из сообщения об ошибке) . В противном случае, если вы все отслеживаете самостоятельно, 0, 1, 2 ... лучше.

6
ответ дан 23 November 2019 в 04:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: