Java десериализация java.lang.Integer - исключение - PullRequest
0 голосов
/ 12 мая 2009

Получено следующее исключение при десериализации HashMap<String, Integer>:

java.io.InvalidClassException: java.lang.Integer; local class incompatible: stream classdesc serialVersionUID = 1360826667802527544, local class serialVersionUID = 1360826667806852920

Сериализовано и десериализовано на одной и той же машине с тем же JRE. JDK 1.6.0_12

Ответы [ 4 ]

4 голосов
/ 12 мая 2009

Если посмотреть на источник JDK, 1360826667806852920 будет правильным serialVersionUID для Integer. Я не смог найти никаких классов в JDK с serialVersionUID 1360826667802527544.

Интересно, что поиск 1360826667802527544 в Google обнаружил несколько других людей с этой проблемой, в частности эту тему на форумах Sun. Проблема заключалась в том, что этот человек хранил байты в строке, а сериализованные данные искажались. Поскольку вы получаете тот же serialVersionUID, очень вероятно, что вы столкнулись с подобной проблемой.

Никогда не храните байты в String. Используйте байтовый массив или класс, предназначенный для хранения байтов, а не символов.

1 голос
/ 11 мая 2017

Я столкнулся с той же проблемой, и это потому, что когда мы пытаемся сохранить объект Integer в String, кодировка символов испортилась, и во время десериализации чтение serialVersionUID является неправильным. Это коренная причина этой ошибки. Чтобы избежать этой ошибки, используйте Base64 кодировка перед сохранением его в String. см. Этот ответ и проблема для меня решена.

        /** Read the object from Base64 string. */
   private static Object fromString( String str ) throws IOException, ClassNotFoundException {
        byte [] data = Base64.getDecoder().decode(str);
        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data));
        Object o = ois.readObject();
        ois.close();
        return o;
   }

    /** Write the object to a Base64 string. */
    private static String toString( Serializable o ) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream( baos );
        oos.writeObject( o );
        oos.close();
        return Base64.getEncoder().encodeToString(baos.toByteArray()); 
    }
1 голос
/ 12 мая 2009

Этого не должно быть. Обратите внимание, что идентификаторы отличаются только последними цифрами; второй - тот, который я вижу в моих источниках JDK.

Я предполагаю, что сериализованный поток как-то поврежден.

1 голос
/ 12 мая 2009

проверьте исходный код для Integer, вот что я имею для Integer в нескольких версиях Java:

/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = 1360826667806852920L;

Так что я бы сказал, что проблема связана с вашим классом, который вы изменили между сериализацией и десериализацией и у которого нет конкретного serialVersionUID ...

Может быть, вам стоит взглянуть на это , то же описание проблемы, и оно выглядит как неправильный код сериализации / десериализации ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...