[英]Serialized object has null values after being sent via UDP to client in java
这个问题使我无所适从。 这是针对我目前正在开发的非常简单的在线多人游戏。
我目前能够通过udp向我的客户端发送数据包,并且它们似乎没问题。 但是,当我将序列化的对象发送给客户端并在另一端反序列化时,尝试访问所需的值时会出现NullPointerExceptions。 我已经验证了对象已在服务器端正确序列化(反序列化并检查了数据),因此我有99%的把握要对发送数据包的代码做错什么。
以下是用于从服务器序列化和发送“ Datagram”对象的代码:
DatagramPacket sendPacket = null;
byte[] buf = null;
//Serialize the datagram object to send as a UDP packet
try {
// Serialize to a byte array
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = new ObjectOutputStream(bos);
out.writeObject(data);
buf = bos.toByteArray();
out.close();
bos.close();
} catch (IOException e) {
}
try {
sendPacket = new DatagramPacket( buf, buf.length,
InetAddress.getLocalHost(), 4004);
} catch (UnknownHostException e){}
try {
DatagramSocket sendSocket = new DatagramSocket();
sendSocket.send( sendPacket );
changed = true;
}catch (IOException e) {}
序列化的“数据”对象充满了正确的值; 我相信这一点。
另一个相关的代码块是客户端上的接收块:
public Datagram readDatagram() {
byte[] buff = new byte[20000];
DatagramPacket packet = new DatagramPacket(buff, buff.length);
DatagramSocket receiver = null;
try {
receiver = new DatagramSocket(4004);
receiver.receive(packet);
} catch (IOException e) {
System.out.println("ERROR2");
}
Datagram data = null;// = new Datagram();
try {
// Deserialize from a byte array
ByteArrayInputStream bis = new ByteArrayInputStream(buff);
ObjectInput in = new ObjectInputStream(bis);
data = (Datagram) in.readObject();
bis.close();
in.close();
} catch (ClassNotFoundException e) {
} catch (IOException e) {
System.out.println("ERROR3");
}
for (int i = 0; i < 35; i++) {
System.out.print(data.getLevel()[i]);
}
receiver.close();
return data;
}
当我尝试在反序列化之后读取任何值时,会收到NullPointerException。 如果有人能指出正确的方向,我将非常高兴。
哦,我现在有意发送到localHost只是为了进行测试。 我的客户端和服务器都在我的计算机上运行。
在发送和接收端,您都在捕获和压缩异常。 这很有可能会隐藏可以帮助您诊断问题的证据。 即使不是这种情况,挤压这样的异常情况也是危险的做法。
我敢打赌,正在接收结束代码中引发ClassNotFoundException
。 这将使您的data == null
,然后将导致以下循环中的NPE。
您的代码可能存在的一个问题是您在关闭ObjectOutputStream
之前调用toByteArray()
:
out.writeObject(data);
buf = bos.toByteArray();
out.close();
bos.close();
如果序列化数据的某些部分直到close()
才写入输出流,在这种情况下它们将丢失。 关闭流后,尝试调用toByteArray()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.