метод readobject генерирует исключение ClassNotFoundException - PullRequest
8 голосов
/ 26 мая 2010

Я пытаюсь подобрать Java и хотел проверить с клиент-сервером Java, чтобы клиент отправлял простой объект самоопределяемого класса (Message) на сервер. Проблема заключалась в том, что я продолжал получать ClassNotFoundException на стороне сервера.

Я думаю, что остальные коды кажутся нормальными, потому что другие объекты, такие как String, могут пройти без проблем.

У меня было два разных проекта NetBeans в разных местах для клиента и сервера каждый.

Каждый из них имеет свою собственную копию класса Message в соответствующих пакетах. Класс сообщений реализует Serializable.

На стороне клиента я пытаюсь отправить объект сообщения через.

На стороне сервера после вызова метода readObject кажется, что он находит класс Message из пакета клиента, а не из его собственного. printStackTrace показало: «java.lang.ClassNotFoundException: client.Message» на стороне сервера

Я даже не пытался наложить или сохранить полученный объект. Я что-то пропустил?

Ответы [ 2 ]

18 голосов
/ 26 мая 2010

Имя пакета и имя класса должны быть точно одинаковыми с обеих сторон. То есть написать один раз, скомпилировать один раз и затем дать обеим сторонам одинаковую копию. У вас нет отдельных классов server.Message и client.Message, но есть один класс shared.Message или что-то в этом роде.

Если вы можете гарантировать одно и то же имя пакета / класса, но не всегда, когда точно одна и та же копия, вам нужно добавить поле serialVersionUID с тем же значением в класс (ы) под вопросом.

package shared;

import java.io.Serializable;

public class Message implements Serializable {
    private static final long serialVersionUID = 1L;

    // ...
}
4 голосов
/ 27 мая 2010

Причина в том, что readObject () в ObjectInputStream практически реализован как:

 String s = readClassName();
 Class c = Class.forName(s); // Here your code breaks
 Object o = c.newInstance();
 ...populate o...
...