通过 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 另一个问题。
我正在写一份 '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 另一个问题。