Если вы хотите сделать несовместимое изменение, вы должны изменить serialVersionUID
, чтобы вы получили соответствующую (если не приятную) ошибку вместо, скажем, ClassCastException
в какой-то момент в дальнейшем.
Если вы хотите сохранить совместимость, сохраните serialVersionUID
и добавьте пользовательский метод readObject
для преобразования List<CharSequence>
в List<String>
.
Редактировать: Чтобы расширить этоЕсли вам нужна совместимость, ваш код должен выглядеть примерно так:
// final - for one thing I don't want to implement readObjectNoData
public final class JeanObject {
Если этот класс был добавлен в качестве подкласса к другому классу, в устаревших сериализованных потоках не было бы «данных».
private static final long serialVersionUID = 1L;
// Mutable field for Java Serialization, but treat as final.
private List<String> values = new ArrayList<>();
Если вы хотите, чтобы values
было final
, вам понадобится вырожденный Serialization Proxy хак, где объект прокси того же типа.
Я собираюсьпредположить, что вы хотите, чтобы объект коллекции был изменяемым.Вы, вероятно, не должны сериализовать изменяемые объекты, но именно так они обычно используются и как выглядит пример OP.
private void readObject(
ObjectInputStream in
) throws IOException, ClassNotFoundException {
ObjectInputStream.GetField fields = in.readFields();
@SuppressWarnings("unchecked")
var oldValues = (List<CharSequence>)fields.get("values", null);
// Don't bother with nice error message.
// NPE if missing or null elements.
this.values = oldValues.stream().collect(
ArrayList::new,
(values, value) -> values.add(value.toString()),
List::addAll
);
}
// ...
Альтернатива (очень функционально выглядящему ) 3-аргументуStream.collect
должен использовать Collectors.mapping
.Старомодный фешенебельный цикл был бы менее запутанным со всех сторон, но это не хвастается в Интернете - вы бы выглядели так, как будто кто-то только что закончил.
Collectors.toList
, вероятно, не подходит как,скажем, добавление элементов в список каким-либо образом вниз по строке может привести к ошибке.Может не сегодня.Может не завтра.Но когда ваш преемник автоматически обновляет реализацию.И они будут ненавидеть тебя всю оставшуюся жизнь.Вот документация по API:
Нет никаких гарантий относительно типа, изменчивости, сериализуемости или поточной безопасности возвращаемого List
Кто этого хочет?
Редактировать: Повторное чтение этой цитаты может привести к невозможности сериализации вашего десериализованного объекта, если вы используете toList
...
(код компилируется, но, как всегда, не проверен.)