Java 反序列化通过ObjectOutputStream发送的对象
我在尝试通过Java 反序列化通过ObjectOutputStream发送的对象,java,sockets,tcp,Java,Sockets,Tcp,我在尝试通过ObjectOutputStream接收字符串的二维/数组时遇到问题。 我发送数组的代码是: String [][] sendable = new String [n][5]; ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream()); os.writeObject(sendable); 假设我的数组已用所有值初始化,如何将接收到的数据解包回二维数组?我的第一种方法是这样,但它一直在引起问题,因
ObjectOutputStream
接收字符串的二维/数组时遇到问题。
我发送数组的代码是:
String [][] sendable = new String [n][5];
ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream());
os.writeObject(sendable);
假设我的数组已用所有值初始化,如何将接收到的数据解包回二维数组?我的第一种方法是这样,但它一直在引起问题,因为我对Java和socket编程相对较新
ObjectInputStream ois =new ObjectInputStream(clientSocket.getInputStream());
String insa[][] = null;
try{
insa= (String[][]) ois.readObject();
} catch (ClassNotFoundException ex){
ex.printStackTrace();
}
System.out.println(insa[0][1]);
如何检索作为对象发送的二维数组?我建议在写入sendable后刷新操作系统:
os.writeObject(sendable);
os.flush();
您可能还希望按照官方文档的建议,在构造函数之后立即调用os.flush()
创建写入指定输出流的ObjectOutputStream。此构造函数将序列化流头写入基础流;调用者可能希望立即刷新流,以确保接收ObjectInputStreams的构造函数在读取标头时不会阻塞
看
您需要在两端的ObjectInputStream之前构造ObjectOutputStream。否则,对等方可能会死锁读取对象流头
在套接字的生命周期中,您需要构造两个流一次,而不是每次发送或接收一次
乍一看,这应该行得通。您看到了什么问题?在objectinputstream声明之后,客户端应用程序没有响应。这是因为它卡在等待输入的while循环中。我建议它卡在ObjectInputStream构造函数中。该代码没有必要。如果存在BufferedOutputStream,您将是正确的。ObjectOutputStream不是BufferedOutputStream,但它有一个内部缓冲区。这就是它实现Flushable接口并提供flush()方法的原因。当然可以看到,但在调用writeObject()后不需要刷新。