Эксперимент с несовместимостью Java-серилизации

64
9

Я понимаю концепцию Java-сериализации, но я в значительной степени смущен совместимостью с версией сериализуемого объекта. Когда упоминается "версия", означает ли это:

либо два класса иерархического отношения, и один из них имеет добавление/дедукцию атрибутов?

или два класса соответствовали различным версиям компиляции?

или оба?

Я понимаю, что мы должны держать suid согласованным, что проверено JVM для совместимости версий.

В результате я разработал эксперимент, пытаясь проверить несовместимость версии java-сериализации, фрагмент кода такой, как показано ниже, в котором я сделал suid другим:

    public static class Incompatible implements Serializable {
private static final long serialVersionUID = 1L;
private int i;
public Incompatible(int i){
this.i = i;
}
public int getI(){
return i;
}
}

public static class IncompFoo extends Incompatible {
private static final long serialVersionUID = 2L;
public IncompFoo(int i){
super(i);
}
}

@Test
public void incompatibleTest() throws IOException, ClassNotFoundException{
FileOutputStream fos = new FileOutputStream(new File("foo.ser"));
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(new IncompFoo(10));
oos.close();

FileInputStream fis = new FileInputStream(new File("foo.ser"));
ObjectInputStream ois = new ObjectInputStream(fis);
Incompatible foo = (Incompatible)ois.readObject();
ois.close();
Assert.assertEquals(10, foo.getI());

}

Я ожидал исключения InvalidClassException, поскольку эти два класса имеют разные suid. К моему удивлению, тест прошел хорошо.

Какая часть была неправильной? У нас есть простой способ создать InvalidClassException?

спросил(а) 2021-01-25T18:04:08+03:00 4 месяца, 2 недели назад
1
Решение
63

Ваш пример записывает объект, читает его и передает его в свой суперкласс. Ничего интересного здесь не происходит, хотя вы надеялись, что актеры каким-то образом сломают вещи (это не так, это просто актерский состав и действительный).

Напишите экземпляр класса в файл, измените его serialVersionUID, перекомпилируйте класс и попробуйте прочитать сериализованный объект. Забудьте о любых супер/подклассах shenanigans.

ответил(а) 2021-01-25T18:04:08+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема