ошибка приведения при накачивании сериализованного объекта на стороне сервера - PullRequest
2 голосов
/ 19 февраля 2012

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

package client; //it is "package server;" on server side

import java.io.Serializable;

public class Simple implements Serializable {
    public String msg;
    public Simple(){
        msg = "simple";
    }
}

на стороне клиента, я сделал:

Simple obj = new Simple();
Socket socket = new Socket(hostname, portNum);
ObjectOutputStream objOut = new ObjectOutputStream(socket.getOutputStream());
objOut.writeObject(obj);
objOut.flush();
objOut.close();

на стороне сервера я сделал:

//already accepted clientSocket
ObjectInputStream objIn = new ObjectInputStream(clientSocket.getInputStream());
Simple anObj = (Simple) objIn.readObject();
System.out.println("from server: " + anObj.msg);
objIn.close();
clientSocket.close();

Однако я получил ошибку:

Exception in thread "main" java.lang.ClassCastException: client.Simple cannot be cast to server.Simple at server.Server.main

Я пробовал что-то похожее с сервером и клиентом в одном пакете, и сериализация и инфляция работали. Буду очень признателен, если вы поможете мне выяснить, почему он здесь не работает.

Ответы [ 3 ]

0 голосов
/ 19 февраля 2012

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

В результате клиент сериализует client.Simple, который сервер также десериализует как client.Simple.Затем вы переходите к типу server.Simple, который является совершенно другим типом.

Это можно показать, выполнив;

ObjectInputStream objIn = new ObjectInputStream(clientSocket.getInputStream());
Object anObj = objIn.readObject();
System.out.println(anObj);               // Output "client.Simple@39617189"
obj = (server.Simple)anObj;              // Throws ClassCastException

Код показывает, что сервер знает, что тип десериализованного объекта - client.Simple, и он просто не может привести его к отдельному типу server.Simple.

0 голосов
/ 19 февраля 2012
  • Что вы сериализуете и отправляете: class client.simple
  • Но на полученном объекте вы пытаетесь настроить его для другого класса class server.simple
  • Это два разныхклассы и, следовательно, вы получаете исключение.
  • Убедитесь, что сервер имеет доступ к тому же классу client.simple, который используется для сериализации.
0 голосов
/ 19 февраля 2012

// это "пакетный сервер"; на стороне сервера Итак, у вас есть два разных простых класса? Я имею в виду, вы объявляете класс "Simple" дважды под двумя разными пакетами, чтобы они были разными и не могли быть cat. Есть только один класс. Вы можете использовать этот учебник .

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