簡體   English   中英

在服務器端擴展序列化對象時發生強制轉換錯誤

[英]cast error when inflating a serialized object on server side

我正在嘗試通過套接字將客戶端的序列化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

我在單個程序包中對服務器和客戶端進行了類似的嘗試,並且序列化和通貨膨脹均有效。 如果您能幫助我找出為什么它在這里不起作用,我將不勝感激。

//它是“打包服務器;” 在服務器端那么,您有兩個不同的Simple類嗎? 我的意思是,您是否在兩個不同的包下兩次聲明了“簡單”類,所以它們是不同的並且不能成為貓。 只有一堂課。 您可以使用本教程

簡單的說; 為了避免不同名稱空間中的兩種類型發生沖突, 包名稱是類型名稱的一部分

發生的是,客戶端對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轉換為單獨的類型server.Simple

  • 您要序列化和發送的是class client.simple
  • 但是在接收的對象上,您嘗試將其類型轉換為其他類的class server.simple
  • 這是兩個不同的類,因此您將獲得例外。
  • 確保服務器可以訪問用於序列化的相同類client.simple

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM