IntelliJ IDEA, генерирующий serialVersionUID

Как сгенерировать это значение в IntelliJ IDEA?

Я иду в Настройки → Ошибки → Проблемы с сериализацией → Сериализуемый класс без 'serialVersionUID, но он все еще не показывает мне предупреждение. Мой класс PKladrBuilding реализует интерфейс Serializable.

Часть кода:

public class PKladrBuilding extends PRQObject

public abstract class PRQObject extends PObject

public abstract class PObject implements Serializable

Ответ 1

Я не уверен, что у вас есть старая версия IntelliJ IDEA, но если я зайду в меню Файл → Настройки... → Проверки → Проблемы с сериализацией → Сериализуемый класс без включенного "serialVersionUID", то класс, который вы предоставляете, дает мне предупреждения.

Enter image description here

Если я попробую первый класс, я увижу:

Enter image description here

Кстати: он не показывал мне предупреждение, пока я не добавил { } в конец каждого класса, чтобы исправить ошибку компиляции.

Ответ 2

Установите плагин GenerateSerialVersionUID от Оливье Дескью.

Перейдите: меню Файл → Настройки → Плагины → Обзор репозиториев → GenerateSerialVersionUID

Установите плагин и перезапустите.

Теперь вы можете сгенерировать идентификатор из меню Code → Generate → serialVersionUID 'или ярлыка.

Ответ 3

Без каких-либо плагинов: вам просто нужно включить подсветку в IntelliJ:

IntelliJ Preferences → Editor → Inspections → Java → Serialization issues → Serializable class without 'serialVersionUID' - установите флаг и нажмите 'OK'.

Теперь, если ваш класс реализует Serializable, вы увидите выделение, и alt+Enter для имени класса предложит сгенерировать private static final long serialVersionUID.

PS: взято отсюда

Ответ 4

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

Ниже приведено подробное описание этого вопроса. Я читаю здесь комментарий.

Собственно, вы не должны "генерировать" UID последовательной версии. Это немая "функция", которая проистекает из общего непонимания того, как этот идентификатор используется Java. Вы должны указывать эти идентификаторы значимыми, читаемыми значениями, например. начиная с 1L и увеличивая их каждый раз, когда вы думаете, что новая версия класса должна отображать все предыдущие версии (которые могут быть ранее сериализованы) устаревшими. Все утилиты, которые генерируют такие идентификаторы, в основном делают то, что делает JVM, когда идентификатор не определен: они генерируют значение, основанное на содержимом файла класса, следовательно, появляются нечитаемые бессмысленные длинные целые числа. Если вы хотите, чтобы каждая версия вашего класса отличалась (в глазах JVM), вы даже не должны указывать значение serialVersionUID, поскольку JVM будет генерировать "на лету", а значение каждой версии вашего класса будет быть уникальный. Целью явного определения этого значения является указание механизму сериализации обрабатывать разные версии класса, которые имеют один и тот же SVUID, как если бы они были одинаковыми, например. не отклонять старые сериализованные версии. Таким образом, если вы определяете идентификатор и никогда не меняете его (и я предполагаю, что вы делаете, так как вы полагаетесь на автоматическое поколение, и вы, вероятно, никогда не воссоздаете свои идентификаторы), вы гарантируете, что все - даже абсолютно разные - версии ваш класс будет считаться одним и тем же механизмом сериализации. Это то, что вы хотите? Если нет, и если вы действительно хотите контролировать, как распознаются ваши объекты, вы должны использовать простые значения, которые вы сами можете понять и легко обновить, когда решите, что класс значительно изменился. Наличие 23-значного значения вообще не помогает.

Надеюсь, это поможет. Удачи.

Ответ 5

Чтобы сгенерировать значение, используйте

private static final long serialVersionUID = $randomLong$L;
$END$

и предоставить переменную шаблона randomLong со следующим значением: groovyScript ( "new Random(). nextLong(). abs()" )

https://pharsfalvi.wordpress.com/2015/03/18/adding-serialversionuid-in-idea/

Ответ 6

Кроме того, вы можете добавить живой шаблон, который будет выполнять работу.

Для этого нажмите Ctrl+Alt+S"Live Templates" раздел → other (или ж/е вы хотите)

И затем создайте новый с таким определением:

private static final long serialVersionUID = 1L;
$END$

Затем выберите область definition и сохраните ее как 'serial'

Теперь вы можете ввести serial TAB в тело класса.

Ответ 7

С версией v2018.2.1

Идти к

Предпочтения> Редактор> Инспекции> Java> Проблемы с сериализацией> переключить "Сериализуемый класс без serialVersionUID".

Предупреждение должно появиться рядом с объявлением класса.

Ответ 8

Я использую Android Studio 2.1, и у меня есть лучшая согласованность получения лампочки, щелкнув по имени класса и навешивая на нее секунду.

Ответ 9

Добавьте живой шаблон с именем ser в другую группу, установите для него значение "Применимо в Java: объявление" и снимите флажок "Сократить имена FQ". Дайте ему текст шаблона просто:

$serial$

Теперь отредактируйте переменные и задайте для serial:

groovyScript("(System.env.JDK_HOME+'/bin/serialver -classpath '+com.intellij.openapi.fileEditor.FileDocumentManager.instance.getFile(_editor.document).path.replaceAll('/java/.*','').replaceAll('/src/','/build/classes/')+' '+_1).execute().text.replaceAll('.*: *','')",qualifiedClassName())

Предполагается стандартная компоновка проекта Gradle. Изменить/построить/на/цель/для Maven.

Ответ 10

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

base_dir=$(pwd)
src_dir=$base_dir/src/main/java
ic_api_cp=$base_dir/target/classes

while read f
do
    clazz=${f//\//.}
    clazz=${clazz/%.java/}
    seruidstr=$(serialver -classpath $ic_api_cp $clazz | cut -d ':' -f 2 | sed -e 's/^\s\+//')
    perl -ni.bak -e "print $_; printf qq{%s\n}, q{    private $seruidstr} if /public class/" $src_dir/$f
done

Вы сохраняете этот скрипт, скажем, как add_serialVersionUID.sh в вашей папке ~/bin. Затем вы запускаете его в корневом каталоге вашего проекта Maven или Gradle, например:

add_serialVersionUID.sh < myJavaToAmend.lst

Это .lst включает в себя список файлов Java для добавления serialVersionUID в следующем формате:

com/abc/ic/api/model/domain/item/BizOrderTransDO.java
com/abc/ic/api/model/domain/item/CardPassFeature.java
com/abc/ic/api/model/domain/item/CategoryFeature.java
com/abc/ic/api/model/domain/item/GoodsFeature.java
com/abc/ic/api/model/domain/item/ItemFeature.java
com/abc/ic/api/model/domain/item/ItemPicUrls.java
com/abc/ic/api/model/domain/item/ItemSkuDO.java
com/abc/ic/api/model/domain/serve/ServeCategoryFeature.java
com/abc/ic/api/model/domain/serve/ServeFeature.java
com/abc/ic/api/model/param/depot/DepotItemDTO.java
com/abc/ic/api/model/param/depot/DepotItemQueryDTO.java
com/abc/ic/api/model/param/depot/InDepotDTO.java
com/abc/ic/api/model/param/depot/OutDepotDTO.java

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

Ответ 11

Другой способ создать serialVersionUID - использовать >Analyze >Run Inspection by Name из контекстного меню (или сочетания клавиш, которые по умолчанию <Ctrl>+<Shift>+<Alt>+I), а затем введите " Сериализуемый класс без "serialVersionUID" (или просто введите "serialVersionUID", и функция опережающего типа найдет его для вас).

Idea >Analyze >Run Inspection by Name Затем вы получите контекстное меню, в котором вы можете выбрать, где проводить проверки (например, все из определенного модуля, всего проекта, одного файла,...)

При таком подходе вам даже не нужно устанавливать общие правила проверки.