簡體   English   中英

通過udp發送后,序列化對象的值為空

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM