У меня есть открытый класс, который реализует Serializable, который расширяется несколькими другими классами. Только эти подклассы были сериализованы раньше - никогда супер класс.
Суперкласс определил serialVersionUID.
Я не уверен, если это имеет значение, но оно не было выделено частным, а скорее оно имело защиту по умолчанию - вы могли бы сказать, что он защищен пакетом
static final long serialVersionUID = -7588980448693010399L;
Суперкласс или любой из подклассов, однако реализованный readObject или writeObject, и ни один из подклассов не имел явно определенного serialVersionUID. Я полагал, что один, определенный в суперклассе, будет достаточным.
Несмотря на все это, все было замечательно, если было прочитано ранее сериализованных объектов до тех пор, пока новая переменная экземпляра, List/ArrayList и новый метод не были добавлены в суперкласс, а некоторые частные переменные экземпляра были добавлены к одному его подклассов.
Теперь, когда вы пытаетесь прочитать ранее сериализованные объекты, генерируется исключение. Аналогично этому:
com.SomeCompany.SomeSubClass; local class incompatible: stream classdesc serialVersionUID = 1597316331807173261, local class serialVersionUID = -3344057582987646196
Я предполагаю, что это вызвано тем, что по умолчанию serialVersionUID, который использовался, потому что я не объявлял его ни в одном из подклассов, теперь изменился из-за изменений в суперклассе и одном подклассе.
Были бы оценены предложения о том, как выйти из этой дилеммы. Я предполагаю, что мне нужно реализовать readObject и writeObject, но кроме вызова defaultReadObject() и defaultWriteObject(), я не совсем уверен, что мне нужно делать. Я также не знаю, нужно ли добавлять serialVerisonUID во все подклассы, или если readObject и writeObject должны быть реализованы каждым подклассом или если я могу просто реализовать их один раз, предполагая, что мне вообще нужно, в суперклассе.