Сериализованный объект имеет нулевые значения после отправки через udp - PullRequest
0 голосов
/ 10 марта 2012

Я настроил модель клиент / сервер UDP, которая может отправлять друг другу строковые сообщения.

Я создал собственный класс LoginRequest, который сериализуется и отправляется на сервер, содержащий имя пользователя и пароль. Когда получатели этих переменных вызываются, они возвращают нулевые значения, хотя я проверяю переменные перед отправкой LoginRequest.

Вот код для сериализации и отправки дейтаграммы с клиента:

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();
        }
    }

Вот код для запроса входа:

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. Я буду чрезвычайно счастлив, если кто-то может указать мне правильное направление.

Ответы [ 2 ]

1 голос
/ 10 марта 2012

Удалите static на свой атрибут имя пользователя и пароль!

0 голосов
/ 10 марта 2012

Вместо чтения вашего LoginRequst как универсального объекта вы можете сделать это следующим образом:

LoginRequest loginRequest = (LoginRequest)ois.readObject();

Вы также можете переопределить метод readObject () в своем классе LoginRequest. Потому что метод readObject отвечает за чтение и восстановление состояния объекта для определенного класса, который вы сериализовали. Я даю тебе направление думать.

...