Я пытаюсь взять Java и хотел протестировать вокруг с клиентом/сервером Java, чтобы заставить клиент отправить простой объект сам определенный класс (сообщение) к серверу. Проблема состояла в том, что я продолжал получать ClassNotFoundException на стороне сервера.
Я думаю, что остальная часть кодов, кажется, в порядке, потому что другие объекты, такие как Строка могут пройти без проблем.
У меня было два различных netbeans проекта в различных местоположениях для клиента и сервера каждый.
У каждого из них есть их собственная копия Класса сообщений под их соответствующими пакетами. Сериализуемые реализации класса сообщений.
На стороне клиента я пытаюсь отправить Объект сообщения через.
На стороне сервера, по вызову readObject метода, это, кажется, находит Класс сообщений от пакета клиента вместо своего собственного. printStackTrace показал: "java.lang. ClassNotFoundException: клиент. Сообщение" на стороне сервера
Я даже не попытался бросить или хранить объект, полученный все же. Есть ли что-то, что я не учел?
Имя пакета и имя класса должны быть абсолютно одинаковыми с обеих сторон. То есть, напишите один раз, скомпилируйте один раз, а затем дайте обеим сторонам одинаковую копию. Не надо иметь отдельные классы server.Message
и client.Message
, а один класс shared.Message
или что-то подобное.
Если вы можете гарантировать одинаковое имя пакета/класса, но не всегда, когда это точно та же копия, тогда вам нужно добавить поле serialVersionUID
с тем же значением к рассматриваемому классу(ам).
package shared;
import java.io.Serializable;
public class Message implements Serializable {
private static final long serialVersionUID = 1L;
// ...
}
Причина в том, что readObject () в ObjectInputStream практически реализован как:
String s = readClassName();
Class c = Class.forName(s); // Here your code breaks
Object o = c.newInstance();
...populate o...