我在我的代码中有一个非常奇怪的情况,我不明白我发送一个对象让我说通过套接字然后我改变对象中的变量的值并再次发送它但第二次当我在客户端打印它,我得到的值与第一个对象相同。
客户代码:
while(true){
try{
order=(Order)ois.readObject();
System.out.println(order);
}
服务器代码:
public void sendOrder(Order o){
try {
out.writeObject(o);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
主要方法:
Server_Socket ss=new Server_Socket();
ss.sendOrder(o);
o.add(r2);
ss.sendOrder(o);
在我发送之前,值在服务器端肯定会发生变化,但我不明白为什么在客户端它没有显示在对象中添加了r2。
答案 0 :(得分:5)
ObjectOutputStream
正在缓存对象。为防止这种情况,请在每次写入后调用ObjectOutputStream.reset()
。如果要发送不包含其他对象的简单对象,请使用writeUnshared()
而不是writeObject()
。
答案 1 :(得分:0)
IOStreams正在缓存对象。要解决此问题,请在发送对象之前在服务器上创建深度克隆。当客户端从流中提取对象时,它将具有不同的实例ID,它实际上将反序列化并在客户端实例化该对象。
有趣的东西。