явный serialVersionUID, который рассматривают вредным?

Двоеточие : отделяет начальную точку от конечной точки последовательности. Он обрабатывается с более высоким приоритетом, чем оператор + или -. Поэтому

nrow(planets_df)-3:nrow(planets_df)

равно

nrow(planets_df) - (3:nrow(planets_df))

. Если вы хотите иметь последние три записи, используя этот синтаксис, вам нужно поместить все выражение, определяющее начало последовательность в скобки:

planets_df[(nrow(planets_df)-3):nrow(planets_df),]
25
задан Miserable Variable 7 January 2009 в 10:00
поделиться

5 ответов

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

19
ответ дан Jon Skeet 15 October 2019 в 16:59
поделиться

На моей работе мы явно запрещаем определение serialVersionUID, точно из-за проблем, которые Вы поднимаете.

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

5
ответ дан Yoni Roit 15 October 2019 в 16:59
поделиться

далее подчеркнуть что сказанная стрельба по тарелочкам Джона и противоречить комментарию:

, "Если Вам не нужно это (т.е. Вы всегда сериализируете и десериализовываете с той же версией класса), тогда можно безопасно пропустить явное объявление"

, Даже если Вы не сериализируете долгосрочный и используете ту же версию класса, у Вас могли все еще быть проблемы . если Вы пишете код клиент-сервер, и клиентский код мог бы выполнить w/различная jvm версия/реализация, чем сервер, у Вас могут быть те же проблемы с несовместимым serialversionuids.

для суммирования [только 117] время "безопасно" не определить, что serialversionuids - когда Вы не сериализируете долгосрочный, и Вам гарантируют это все, потребители сериализированных данных будут использовать ту же jvm реализацию и версию как исходный производитель.

короче говоря, не использование serialversionuid обычно является более вредной ситуацией.

4
ответ дан james 15 October 2019 в 16:59
поделиться

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

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

, Если Вам не нужно это (т.е. Вы всегда сериализируете и десериализовываете с той же версией класса), тогда можно безопасно пропустить явное объявление, поскольку вычисленное значение удостоверится, что правильная версия используется.

2
ответ дан Joachim Sauer 15 October 2019 в 16:59
поделиться

Идете ли Вы для serialVersionUID или не (я предлагаю, чтобы Вы сделали), тогда необходимо действительно рассмотреть создание исчерпывающего набора тестов для последовательной совместимости.

также стоит разработать последовательный формат с осторожностью. Это - эффективно общедоступный API.

1
ответ дан Tom Hawtin - tackline 15 October 2019 в 16:59
поделиться
Другие вопросы по тегам:

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