Java 网络序列化在可序列化对象上失败

标签 java sockets networking serialization tcp

我正在开发一个简单的客户端/服务器程序,现在它应该做的就是在连接时从客户端向服务器发送一个对象,然后从服务器发送一个包含响应的对象。

我的对象应该发送用户名和密码。是的,我知道还有其他方法可以验证 TCP 连接,但这是一个帮助我熟悉 java 网络的测试。

我的对象是这样写的:

   import java.io.Serializable;

public class AuthAccount implements Serializable{
    private static final long serialVersionUID = -8918729105550799244L;
    private String username;
    private String password;

    AuthAccount(String user, String pass){
        username = user;
        password = pass;
    }
    String username(){
        return username;
    }
    String password(){
        return password;
    }
}

Socket 连接成功,但是在这一行失败(oos is ObjectOutputStream):

System.out.print("Sending login object to server...");
oos.writeObject(new AuthAccount("user", "password"));
System.out.println("Done!");

我一直收到错误:

java.io.NotSerializableException: AuthAccount

我已经使用 char[] username = new char[30]; 尝试了 AuthAccount 测试类,以获得固定大小的对象。我更喜欢 C++,但对于这个项目,Java 对我来说很有意义。

最佳答案

您必须使用旧版本的构建,因为

public class Main {
    public static void main(String... args) throws IOException, ClassNotFoundException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(new AuthAccount("u", "p"));
        oos.close();

        ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
        Object aa = ois.readObject();
    }
}
 class AuthAccount implements Serializable{
    private static final long serialVersionUID = 1;
    private final String username;
    private final String password;

    AuthAccount(String user, String pass){
        username = user;
        password = pass;
    }
    String username(){
        return username;
    }
    String password(){
        return password;
    }
}

运行没有错误。

关于Java 网络序列化在可序列化对象上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11889260/

相关文章:

java - 自定义列表 + JSP + java.lang.NumberFormatException

java - 哪个 TaskExecutor 用于异步日志记录?

java - 水平翻转 View - 如何?

linux - 我可以打开一个套接字并将其传递给 Linux 中的另一个进程吗

windows - 操作系统 Windows 和 Linux 中 TCP 窗口大小的默认值

networking - 当 tcp/udp 服务器发布速度快于客户端消耗速度时会发生什么?

java - spring cloud stream kafka背压

vb.net - 如何创建多个套接字作为索引

java - 即使使用 setReuseAddress(true) 也会发生绑定(bind)错误

Golang TCP拨号错误: host is down