通过 ObjectInputStream 发送对象链接列表会引发异常'NotSerializableException'和'StreamCorruptedException'



我正在写一个简单的"太空入侵者"副本。我想添加网络功能,atm我有写/读数据的问题。所以我有一个(对象)外星人的LinkedList,我想把它发送给客户端,更新他们的位置。

问题从这里开始:

在服务器端,我得到了异常:"java.io.NotSerializableException: sun.awt.image.ToolkitImage"

(类异形实现Serializable)

客户端:'StreamCorruptedException:无效类型代码:AC'

向客户端发送数据的代码:

else if(Server) 
{
    while(true)
    {
        ServerSocket server = new ServerSocket(1500);
        serverSocket = server.accept();
        new NetworkThreadHelp(serverSocket, board.GetAlienList()).start();
    } 
}

NetworkThreadHelp代码:

public class NetworkThreadHelp extends Thread
{
    private Socket socket = null;
    private LinkedList<Alien> Aliens = new LinkedList<Alien>();
    public NetworkThreadHelp(Socket socket, LinkedList<Alien> A)
    {
        super("NetworkThreadHelp");
        this.socket = socket;
        this.Aliens = A;
    }
    public void run()
    {
        try
        {
            ObjectOutputStream objectOutput = new ObjectOutputStream(socket.getOutputStream());
            objectOutput.writeObject(Aliens);
            objectOutput.flush();
            objectOutput.close();
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
}

数据读取代码:

else if(Client)
{
    Socket socket = new Socket("127.0.0.1",1500);
    ObjectInputStream objectInput;
    while (true) 
    {
        objectInput= new ObjectInputStream(socket.getInputStream());
        Object object = objectInput.readObject();//Here code doesn't initialize, everything below this won't execute
        LinkedList<Alien> Aliens = (LinkedList<Alien>) object;
        board.UpdateAliens(Aliens);
    }
}

我的问题是:如何使这个工作,写和读正确?

很可能您的Alien类包含对不可序列化的ToolkitImage类的实例的实例引用。您可能需要重构您的代码,使Alien类不包含这样的实例引用,例如,通过使该引用为静态常数。或者,您可以为Alien类编写自定义writeObject()readObject()readObjectNoData()方法,这些方法在Javadoc中为Serializable指定。

你的客户端问题可能是也可能不是一个不同的问题,但我建议先解决服务器端问题。如果您仍然有客户端问题,您可以随时发布另一个问题。

相关内容

  • 没有找到相关文章

最新更新