Сериализованный объект имеет нулевые значения после отправки через UDP клиенту в Java - PullRequest
2 голосов
/ 19 октября 2011

Эта проблема толкает меня к стене. Это для очень простой многопользовательской онлайн-игры, над которой я сейчас работаю.

В настоящее время я могу отправлять пакеты через udp своим клиентам, и они, кажется, получают их нормально. Однако, когда я отправляю сериализованный объект моему клиенту и десериализую на другом конце, я получаю исключения NullPointerException, когда пытаюсь получить доступ к нужным значениям. Я проверил, что объект правильно сериализован на стороне сервера (десериализовал его и проверил данные), поэтому я на 99% уверен, что с кодом для отправки пакета я что-то очень неправильно делаю.

Вот код для сериализации и отправки объекта «Датаграмма» с сервера:

    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) {}

сериализуемый объект «data» полон правильных значений; Я уверен в этом.

Другой соответствующий кодовый блок - это блок приема на стороне клиента:

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 специально, чтобы проверить все. Мой клиент и сервер работают на моем компьютере.

Ответы [ 2 ]

2 голосов
/ 19 октября 2011

Одной из возможных проблем с вашим кодом является то, что вы звоните toByteArray() перед закрытием ObjectOutputStream:

out.writeObject(data);
buf = bos.toByteArray();

out.close();
bos.close(); 

Если некоторые части сериализованных данных не будут записаны в выходной поток до close(), в этом случае они будут потеряны. Попробуйте позвонить toByteArray() после закрытия потоков.

2 голосов
/ 19 октября 2011

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

Моя ставка в том, что ClassNotFoundException добавляется в код получающего конца. Это оставило бы вас с data == null, а затем привело бы к NPE в следующем цикле.

...