2010-05-26 2 views
7

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

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

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

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

С клиентской стороны я пытаюсь отправить объект Message.

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

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

ответ

16

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

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

package shared; 

import java.io.Serializable; 

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

    // ... 
} 
+2

И, пожалуйста, не делайте serialUID точно 1L, потому что это может помешать другой глупый разработчик, имеющий та же идея. – Daniel

+0

Теперь он работает! Спасибо, ~ !! Наконец я наконец понял, что происходит – eruina

+0

Добро пожаловать. – BalusC

4

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

String s = readClassName(); 
Class c = Class.forName(s); // Here your code breaks 
Object o = c.newInstance(); 
...populate o... 
Смежные вопросы