java.io.InvalidClassException: несовместимый локальный класс:

Я создал клиент и сервер, а затем добавил класс на стороне клиента для сериализации, а затем просто перешел в папку клиента на моем жестком диске и скопировал и вставил его в соответствующее расположение на сервере, обаclassname.class а такжеclassname.java соответственно.

Он хорошо работал на моем ноутбуке, но когда я хотел продолжить работу в другой системе, когда я открывал папки проектов и после того, как клиент пытается подключиться к серверу, появляется следующая ошибка:

<code>Exception in thread "main" java.io.InvalidClassException: projectname.clasname; local class incompatible: stream classdesc serialVersionUID = -6009442170907349114, local class serialVersionUID = 6529685098267757690
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1582)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
</code>

Что происходит? Это потому, что я запустил программу с более старой версией IDE?

РЕДАКТИРОВАТ
<code>import java.io.Serializable;
import java.net.URL;

public class KeyAdr implements Serializable {
  private static final long serialVersionUID = 6529685098267757690L;

  public URL adr;
  public String key;
}
</code>

Ответы на вопрос(5)

что это происходит потому, что вы используете разные версии одного и того же класса на клиенте и сервере. Это могут быть разные поля данных или методы

Решение Вопроса

private static final long serialVersionUID в коде он будет сгенерирован автоматически, и нет никакой гарантии, что разные машины сгенерируют один и тот же идентификатор; похоже, именно это и произошло. Также, если классы отличаются в любом случае (используя разные версии класса), автоматически сгенерированныйserialVersionUIDs также будет другим.

ОтSerializable интерфейс @ Докумен:

Если сериализуемый класс явно не объявляетserialVersionUID, тогда во время выполнения сериализации будет вычислено значение по умолчаниюserialVersionUIDначение @ для этого класса основано на различных аспектах класса, как описано в Спецификации сериализации объектов Java (TM). Тем не менее, этонастоятельно рекомендуетс что все сериализуемые классы явно объявляютserialVersionUID значения, так как по умолчаниюserialVersionUID вычисления очень чувствительны к деталям класса, которые могут варьироваться в зависимости от реализаций компилятора, и, следовательно, могут привести к неожиданномуInvalidClassExceptions во время десериализации. Поэтому, чтобы гарантировать последовательнserialVersionUIDначение @ в различных реализациях Java-компилятора, сериализуемый класс должен объявить явныйserialVersionUID ценность. Также настоятельно рекомендуется, чтобы явныйserialVersionUID объявления используютprivateодификатор @, где это возможно, так как такие объявления применяются только к классу, который немедленно объявлен -serialVersionUIDоля @ не используются как унаследованные члены. Классы массива не могут объявить явныйserialVersionUID, поэтому они всегда имеют вычисленное значение по умолчанию, но требуется соответствиеserialVersionUID values отменяется для классов массива.

Вы должны определитьserialVersionUID в определении класса, например :

class MyClass implements Serializable {
    private static final long serialVersionUID = 6529685098267757690L;
    ...
 lonesome30 апр. 2012 г., 07:56
все еще та же ошибка происходит
 lonesome30 апр. 2012 г., 07:36
Как настроить serialVersionUID в определении?
 yair30 апр. 2012 г., 08:47
попробуйте очистить результаты проекта .class файлы, созданные во время компиляции) и пересобрать (перекомпилировать) проекты.
 trutheality30 апр. 2012 г., 08:19
Это странно. Я бы дважды проверил, что обе стороны используют новейшую версию класса.
 lonesome30 апр. 2012 г., 08:39
i даже сделал два новых проекта с одинаковыми именами и создал классы с самого начала, но все же это происходит

спортный формат - она слишком хрупкая для этого. С малейшей разницей в байт-коде класса и JVM ваши данные больше не читаются. Используйте привязку данных XML или JSON для своей задачи XStream быстрый и простой в использовании, и есть множество альтернатив)

 Sanjay T. Sharma30 апр. 2012 г., 08:43
Я могу до некоторой степени согласиться с постоянством, но нет ничего плохого в том, чтобы использовать сериализацию Java в качестве транспортного формата. Это слишком хрупко, если кто-то не знает таких концепций Java-сериализации, какserialVersionUID S.
 Sanjay T. Sharma30 апр. 2012 г., 10:47
На самом деле это не так. Может быть, мы просто видим мир «сериализации Java» с разноцветными очками. Плюс это в значительной степени единственный вариант при использовании RMI. Кроме того, я вижу, что вы сделали какой-то комментарий о «скиновании чего-то менеджера проекта», который был отредактирован позже ...
 user20742130 апр. 2012 г., 12:06
"Малейшая разница в байт-коде класса и JVM, и ваши данные больше не читаются". Это просто неправда. См. Раздел «Управление версиями объектов» в спецификации «Сериализация объектов».
 jpaugh20 сент. 2016 г., 16:12
 Konstantin Pribluda30 апр. 2012 г., 08:48
Даже тогда она хрупкая.

1: вы создаете сериализованные данные с заданной библиотекой A (версия X) 2: вы затем пытаетесь прочитать эти данные с той же библиотекой A (но версия Y)

Hence, во время компиляции для версии X JVM сгенерирует первый серийный идентификатор (для версии X) и сделает то же самое с другой версией Y (другой серийный идентификатор).

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

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

что версии класса, которые также включают метаданные класса, со временем изменились. Другими словами, структура класса во время сериализации не одинакова во время десериализации. Это то, что, скорее всего, "происходит".

Ваш ответ на вопрос