Двоеточие :
отделяет начальную точку от конечной точки последовательности. Он обрабатывается с более высоким приоритетом, чем оператор +
или -
. Поэтому
nrow(planets_df)-3:nrow(planets_df)
равно
nrow(planets_df) - (3:nrow(planets_df))
. Если вы хотите иметь последние три записи, используя этот синтаксис, вам нужно поместить все выражение, определяющее начало последовательность в скобки:
planets_df[(nrow(planets_df)-3):nrow(planets_df),]
Изменение, когда это не было должно, может произойти по причинам кроме изменений макета класса - проблема состоит в том, что это - зависящий от реализации компилятор. Если Вы действительно отлаживаете с Eclipse, но делаете производственные сборки с javac, Вы можете заканчивать с двумя несовместимыми наборами данных.
На моей работе мы явно запрещаем определение serialVersionUID, точно из-за проблем, которые Вы поднимаете.
, Кроме того, классы, которые мы сохраняем, только используются, чтобы хранить данные без логики внутри, таким образом, единственный способ, которым они изменяются, из-за изменения элементов данных.
далее подчеркнуть что сказанная стрельба по тарелочкам Джона и противоречить комментарию:
, "Если Вам не нужно это (т.е. Вы всегда сериализируете и десериализовываете с той же версией класса), тогда можно безопасно пропустить явное объявление"
, Даже если Вы не сериализируете долгосрочный и используете ту же версию класса, у Вас могли все еще быть проблемы . если Вы пишете код клиент-сервер, и клиентский код мог бы выполнить w/различная jvm версия/реализация, чем сервер, у Вас могут быть те же проблемы с несовместимым serialversionuids.
для суммирования [только 117] время "безопасно" не определить, что serialversionuids - когда Вы не сериализируете долгосрочный, и Вам гарантируют это все, потребители сериализированных данных будут использовать ту же jvm реализацию и версию как исходный производитель.
короче говоря, не использование serialversionuid обычно является более вредной ситуацией.
Когда необходимо поддерживать долговременную персистентность через сериализацию, тогда Вы почти всегда должны использовать пользовательский код для поддержки этого и должны явно установить эти serialVersionUID
, поскольку иначе более старая сериализированная версия не будет de-serializable более новым кодом.
Те сценарии уже требуют большого ухода для получения всех корректных случаев, когда класс изменяется, таким образом, serialVersionUID является наименьшим количеством проблем.
, Если Вам не нужно это (т.е. Вы всегда сериализируете и десериализовываете с той же версией класса), тогда можно безопасно пропустить явное объявление, поскольку вычисленное значение удостоверится, что правильная версия используется.
Идете ли Вы для serialVersionUID
или не (я предлагаю, чтобы Вы сделали), тогда необходимо действительно рассмотреть создание исчерпывающего набора тестов для последовательной совместимости.
также стоит разработать последовательный формат с осторожностью. Это - эффективно общедоступный API.