Потратив некоторое время на сериализацию, я обнаружил, что мы не должны генерировать serialVersionUID
с каким-то случайным значением, мы должны придать ему значимое значение.
На самом деле, вы не должны «генерировать» серийные версии UID. Это глупая «особенность», которая проистекает из общего недопонимания того, как этот идентификатор используется Java. Вам следует давать этим идентификаторам значимые, читаемые значения, например, начиная с 1L, и увеличивать их каждый раз, когда вы думаете, что новая версия класса должна сделать все предыдущие версии (которые могли быть ранее сериализованы) устаревшими. Все утилиты, которые генерируют такие идентификаторы, в основном делают то, что делает JVM, когда идентификатор не определен: они генерируют значение на основе содержимого файла класса, следовательно, получают нечитаемые бессмысленные длинные целые числа. Если вы хотите, чтобы каждая версия вашего класса отличалась (в глазах JVM), вам даже не следует указывать значение serialVersionUID, если только JVM создаст его на лету, и ценность каждой версии вашего класса будет уникальной. Целью явного определения этого значения является указание механизму сериализации обрабатывать разные версии класса, имеющие одинаковый SVUID, как если бы они были одинаковыми, например, не отклонять старые сериализованные версии. Итак, если вы определяете идентификатор и никогда не меняете его (и я предполагаю, что это то, что вы делаете, поскольку вы полагаетесь на автогенерацию, и вы, вероятно, никогда не пересоздаете свои идентификаторы), вы гарантируете, что все - даже абсолютно разные - версии ваш класс будет считаться тем же механизмом сериализации. Это то, что вы хотите? Если нет, и если вы действительно хотите контролировать то, как распознаются ваши объекты, вы должны использовать простые значения, которые вы сами можете понять и легко обновить, когда решите, что класс значительно изменился.
Надеюсь это поможет. Удачи.
1L
как ваш идентификатор и приращение при изменении вашей сериализованной формы. (См. Stackoverflow.com/questions/888335/… ).