我已经建立了一个 UDP 客户端/服务器模型,可以相互发送字符串消息。
我创建了一个自定义类 LoginRequest,它被序列化并发送到包含用户名和密码的服务器。当调用这些变量的 getter 时,即使我在发送 LoginRequest 之前检查了变量,它们也会返回 null 值。
以下是从客户端序列化和发送数据报的代码:
private void login(String name, char[] pass) throws SQLException {
try {
LoginRequest login = new LoginRequest(name, pass);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(login);
byte[] buffer= baos.toByteArray();
oos.close();
baos.close();
DatagramPacket packet =
new DatagramPacket(buffer, buffer.length, InetAddress.getByName(SERVER), 10110);
DatagramSocket sSocket = new DatagramSocket();
sSocket.send(packet);
login.getUsername();
} catch (Exception e) {
e.printStackTrace();
}
}
以下是反序列化 LoginRequest 并读取用户名的代码:
private void readMessage() {
try {
ByteArrayInputStream bais = new ByteArrayInputStream(cPacket.getData());
ObjectInputStream ois = new ObjectInputStream(bais);
Object obj = ois.readObject();
bais.close();
ois.close();
if(obj instanceof LoginRequest) {
System.out.println("Login request");
LoginRequest login = (LoginRequest) obj;
login.getUsername();
} else {
System.out.println("Not a login request");
}
} catch (Exception e) {
e.printStackTrace();
}
}
这是 LoginRequest 的代码:
public class LoginRequest implements Serializable {
/**
*
*/
private static final long serialVersionUID = -1379800611469143228L;
private static String username;
private static char[] password;
public LoginRequest(String name, char[] pass) {
username = name;
password = pass;
}
public String getUsername() {
System.out.println("Username: " + username);
return username;
}
public char[] getPassword() {
String p = password.toString();
System.out.println("Password: " + p);
return password;
}
}
当我尝试在反序列化后读取用户名或密码时,我收到 NullPointerException。如果有人能指出我正确的方向,我将非常高兴。
最佳答案
将static
放在您的属性用户名和密码上!
关于java - 通过 udp 发送后序列化对象具有空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9642222/