java.io.InvalidClassException при десериализации объекта после некоторой модификации в классе java

Почему не удалось десериализовать, однако я сериализовал этот класс контейнера, используя serialVersionUID = 75264711556228L;

public class Container implements Serializable {
    private static final long serialVersionUID = 75264711556228L;
    public boolean isFromLocalCollect=false;
    public boolean isFromLocalCollect=false;
    public void setFromLocalCollect(boolean isFromLocalCollect) {
        this.isFromLocalCollect=isFromLocalCollect;
    }
    public boolean getFromLocalCollect() {
        return this.isFromLocalCollect;
    }
}

теперь я добавил еще один метод установки и получения в классе Container после сериализации с именем container.ser, например:

public class Container implements Serializable {
    private static final long serialVersionUID = 75264711556228L;
    public boolean isFromLocalCollect=false;
    public boolean isFromLocalCollect=false;
    public void setFromLocalCollect(boolean isFromLocalCollect) {
        this.isFromLocalCollect=isFromLocalCollect;
    }
    public boolean getFromLocalCollect() {
        return this.isFromLocalCollect;
    }
    public boolean isFromLocalCollect2=false;
    public void setFromLocalCollect2(boolean isFromLocalCollect2) {
        this.isFromLocalCollect2=isFromLocalCollect2;
    }
    public boolean getFromLocalCollect2() {
        return this.isFromLocalCollect2;
    }
}

Затем я пытаюсь десериализовать объект, используя измененное имя проекта, но не смог десериализовать, и я получил ошибку:

java.io.InvalidClassException: cvb.db.PbDb; local class incompatible: stream classdesc serialVersionUID = -444070985558173412, local class serialVersionUID = 4350771162641935418

person Dinanath Parit    schedule 16.01.2016    source источник


Ответы (2)


Когда вы сериализовали объект, вы использовали версию Container.class, отличную от версии Container.class, используемой для его десериализации.

Вам нужно всегда использовать один и тот же .class, чтобы быть уверенным, что операция сериализации-десериализации будет работать правильно.

person Davide Lorenzo MARINO    schedule 16.01.2016

На самом деле то, что я сделал, я просто использовал эту статическую конечную переменную serialVersionUID в классе cvb.db.PbDb, например:

private static final long serialVersionUID = 75264711556227L;

а в классе Container уже были явно объявлены serialVersionUID. После этого я сериализую и десериализую с другим путем контекста приложения, поэтому исключение исчезло, и теперь оно работает нормально для меня.

person Dinanath Parit    schedule 21.01.2016