【问题标题】:Serialized object has null values after sending via udp通过 udp 发送后,序列化对象具有空值
【发布时间】:2012-03-09 23:12:43
【问题描述】:

我已经建立了一个UDP客户端/服务器模型,可以互相发送字符串消息。

我创建了一个自定义类 LoginRequest,它被序列化并发送到包含用户名和密码的服务器。当调用这些变量的 getter 时,即使我在发送 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();
        }
    }

这是 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。如果有人能指出我正确的方向,我会非常高兴。

【问题讨论】:

  • 能把LoginRequest的代码放上来吗?你的 NPE 发生在哪里,我在你的代码中找不到它。最后,但这是显而易见的,您检查发送方的名称和密码不为空吗?
  • 用户名和密码在服务器端为空,但在客户端给出正确的值,当我调用 getPassword() 时得到 NPE。 getUsername() 返回一个空值。

标签: java serialization udp client


【解决方案1】:

在您的属性用户名和密码上删除static

【讨论】:

  • 不客气,但您可能应该了解static 的含义,因为在您的情况下使用它绝对没有意义。
【解决方案2】:

您可以这样做,而不是将您的 LoginRequst 作为通用对象读取:

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

您还可以覆盖 LoginRequest 类中的 readObject() 方法。因为 readObject 方法负责读取和恢复您序列化的特定类的对象状态。我给你一个思考的方向。

【讨论】:

  • 冒着 ClassCastException 的风险。
猜你喜欢
  • 2011-12-11
  • 1970-01-01
  • 2016-03-31
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多