Некоторое время назад я опубликовал приложение, которое сериализовало / десериализовало объект пользователя.
public String serializeUser(final User user) {
final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
final ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(user);
objectOutputStream.close();
} catch (final IOException exception) {
...
}
return new String(Base64.encode(byteArrayOutputStream.toByteArray(), DEFAULT));
}
public User deserializeString(final String userString) {
final byte userBytes[] = Base64.decode(userString.getBytes(), DEFAULT);
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(userBytes);
final ObjectInputStream objectInputStream;
final User user;
try {
objectInputStream = new ObjectInputStream(byteArrayInputStream);
user = (User) objectInputStream.readObject();
objectInputStream.close();
} catch (final IOException | ClassNotFoundException exception) {
...
}
return user;
}
Объект был реализован следующим образом:
public class User implements Serializable {
private String email;
private String name;
...
}
Затем, после изменения моего объекта (я добавил новое поле), я узнал, как трудно установитьserialVersionUID
в случае, если определение объекта когда-либо изменится, иначе десериализатор не сможет распознать сохраненный объект (так как он автоматически сгенерирует serialVersionUID
).Поэтому я продолжил и сделал следующее:
public class User implements Serializable {
private static final long serialVersionUID = 123L;
...
}
Но теперь, когда я переиздал приложение с этими изменениями, я продолжаю получать сообщения об ошибках, указывающие, что объект не может быть десериализован:
Причина: java.io.InvalidClassException: com.myproject.he;несовместимый локальный класс: stream classdesc serialVersionUID = 184861231695454120, локальный класс serialVersionUID = -2021388307940757454
Мне очень известно, что установка новой последовательной версии сделает недействительной любую предыдущую последовательную версию ( link1 ), link2 ), но это не так.Как вы можете видеть, журнал ошибок указывает на совершенно другое serialVersionUID
, чем то, которое я вручную установил для своего User
класса.
Чего мне не хватает?
Если оно какого-либоактуальность, я использую Proguard с настройками по умолчанию.