![](/img/trans.png)
[英]Serialized object has null values after being sent via UDP to client in java
[英]Serialized object has null values after sending via udp
我已經建立了一個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
字符!
您可以通過以下方式做到這一點,而不是將LoginRequst理解為通用對象:
LoginRequest loginRequest = (LoginRequest)ois.readObject();
您還可以在LoginRequest類中重寫readObject()方法。 因為readObject方法負責為序列化的特定類讀取和還原對象的狀態。 我給你一個思考的方向。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.