通过 ObjectInputStream 发送对象的 LinkedList 抛出异常 'NotSerializableException' 和 'StreamCorruptedException'

Sending LinkedList of Objects through ObjectInputStream throws exceptions 'NotSerializableException' and 'StreamCorruptedException'

我正在写一份 'Space Invaders' 的简单副本。我想添加网络功能,并且 atm 我的 Writing/Reading 数据有问题。 所以我有一个(对象)Aliens 的 LinkedList,我想将其发送给客户,以更新他们的位置。

问题从这里开始:

在服务器端出现异常: 'java.io.NotSerializableException: sun.awt.image.ToolkitImage'

(Class外星人实现Serializable)

在客户端: 'StreamCorruptedException: invalid type code: 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 class 包含对不可序列化 ToolkitImage class 实例的实例引用。您可能需要重构您的代码,以便 Alien class 不包含此类实例引用,例如通过使该引用成为静态常量。或者,您可以为 Alien class 编写自定义 writeObject()readObject()readObjectNoData() 方法,如 Serializable 的 Javadoc 中指定的那样。 =18=]

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