Java 重建序列化对象
我试图重建一个序列化对象并从中访问数据 这就是我发送对象的方式Java 重建序列化对象,java,deserialization,Java,Deserialization,我试图重建一个序列化对象并从中访问数据 这就是我发送对象的方式 Socket socket = new Socket ("localhost", port); ObjectOutputStream out = new ObjectOutputStream (socket.getOutputStream()); Tester t = new Tester("test"); out.writeObject(t); out.flush(); 这就是我收到它的方
Socket socket = new Socket ("localhost", port);
ObjectOutputStream out = new ObjectOutputStream (socket.getOutputStream());
Tester t = new Tester("test");
out.writeObject(t);
out.flush();
这就是我收到它的方式
//这就是服务器的构建方式
private ServerSocket server;
server = new ServerSocket(port);
newsocket = server.accept();
//这就是我实际获取对象的方式
ObjectInputStream input = new ObjectInputStream(newSocket.getInputStream());
Tester obj = (Tester) input.readObject();
System.out.println(obj.getText());
但是,我只得到以下输出
[Ljava.lang.StackTraceElement;@237360be
我希望得到的是我在对象“Test”中发送的字符串。我做错什么了吗
我的Tester类看起来像这样
public class Tester implements Serializable {
private String theMessage = "";
public Tester(String message) {
theMessage = message;
}
public String getText() {
return theMessage;
}
}
试试这个
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream();
Tester tester0 = new Tester("test")
oos.writeObject(tester0);
oos.close();
System.out.println(tester0.getText());
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
Tester tester = (Tester) ois.readObject();
System.out.println(tester.getText());
如果这不起作用,您的序列化代码中可能有一个bug。看来,您已经将套接字侦听器的代码块包装到了
try…catch
语句中,您在catch
部分中以错误的方式使用了一些记录器:它打印堆栈跟踪,而不是打印错误原因。这是最可能的解释,为什么您会收到[Ljava.lang.StackTraceeElement;…
实际上,您的套接字侦听器代码捕获了一些异常,您必须以适当的方式打印这些异常。您显示的代码看起来很好。您正在尝试将堆栈跟踪打印为数组,这至少可以说是不寻常的。我们可以查看
getText()的代码吗
method?向我们展示如何构造newSocket
对象?也许客户端和服务器上有不同版本的类?但我希望看到实际的异常,而不是序列化堆栈跟踪。您可以尝试删除序列化,看看是否可以发送/接收带有读写器的简单字符串,查看是套接字问题还是序列化问题。无法重现错误。代码运行正常,输出为“测试”。嗨,Peter,我在接收端收到错误(找不到符号BAS)我需要在某个地方设置它吗?您需要在一个方法/测试中运行代码。它在一开始就定义了。@russoue,我同意,但这是最可能的解释。