Java套接字/序列化,对象不会更新

我正在写一个基于socket的程序。 我正在使用类ModelEvent通过套接字传递信息。 在ModelEvent里面,有一个types为(Object)的variablesobect。

对象本身是一个具有一些值的二维数组。

object[1][2] = 2; ModelEvent event = new ModelEvent("allo", object); dispatchEvent(event); object[2][3] = 2; ModelEvent event2 = new ModelEvent("you", object); dispatchEvent(event2); 

假设数组对象填充了值1.第一个事件(事件)由客户端接收,并且数据是正确的。 通过数据发送的第二个事件是不正确的。 其数据与第一次调度相同。 “allo”和“you”是看我是不是两次阅读同一个事件,答案不是。 该string是正确的,但该对象不是,如果它已被更新的事件。 我发送第二个事件之前遍历数组,看看它是否在服务器端更新,它是。 但在客户端,即使事件本身发生变化,它仍然与第一次调度相同。

请参阅ObjectOutputStream.reset

重置将忽略已写入stream的任何对象的状态。 状态被重置为与新的ObjectOutputStream相同。 stream中的当前点被标记为重置,因此相应的ObjectInputStream将在同一点重置。 以前写入stream的对象不会被认为已经在stream中。 他们将再次被写入stream中。

 /* prevent using back references */ output.reset(); output.writeObject(...); 

在写入同一个对象之前调用reset,以确保它的更新状态被序列化。 否则,只会使用过时状态的以前写入对象的反向引用

或者,你也可以使用ObjectOutputStream.writeUnshared如下。

将一个“非共享”对象写入ObjectOutputStream 。 此方法与writeObject相同,不同之处在于它始终将给定的对象作为stream中的新唯一对象(而不是指向先前序列化的实例的后向引用)写入。

特别:

  • 通过writeUnshared写入的对象总是以与新出现的对象(还没有被写入到stream中的对象)相同的方式被序列化,而不pipe该对象是否先前被写入。

  • 如果使用writeObject写入先前用writeUnshared写入的对象,则先前的writeUnshared操作被视为写入单独的对象。 换句话说, ObjectOutputStream永远不会生成对写入未writeUnshared调用写入的对象数据的反向引用。

当通过writeUnshared编写一个对象本身并不保证在反序列化时对对象的唯一引用,它允许在一个stream中多次定义一个对象,这样接收者readUnshared的多个调用不会发生冲突。 请注意,上述规则仅适用于使用writeUnshared写入的基本级别对象,而不适用于要序列化的对象graphics中任何传递引用的子对象。

 output.writeUnshared(...); 

请注意,将它与ObjectInputStream.readUnshared耦合是一种很好的做法。

ObjectInputStream读取一个“非共享”对象。 此方法与readObject相同,不同之处在于它阻止对readObject后续调用,并且readUnshared不会返回通过此调用获取的反序列化实例的附加引用。

特别:

  • 如果readUnshared来反序列化反向引用(以前写入stream的对象的stream表示forms),则会引发ObjectStreamException
  • 如果readUnshared成功返回,则任何后续反向串行化对由readUnshared反序列化的stream句柄的反向引用的尝试readUnshared将导致抛出ObjectStreamException

通过readUnshared反序列化对象将使与返回对象关联的stream句柄无效。 请注意,这本身并不总是保证readUnshared返回的readUnshared是唯一的; 反序列化的对象可以定义一个readResolve方法,该方法返回一个可见的对象给另一方,或者readUnshared可以返回一个Class对象或者可以在stream中其他地方或者通过外部方法获得的enum常量。 如果反序列化的对象定义了一个readResolve方法,并且该方法的调用返回一个数组,则readUnshared将返回该数组的浅表副本; 这保证返回的数组对象是唯一的,即使基础数据stream已被操作,也不能从调用readObject或readInstance在ObjectInputStream获得第二次。

 obj = input.readUnshared(); 

我没有看到dispatchEvent代码,但是从你写的东西我假设如下:你写同一个对象(只有它的状态改变了),这意味着它将只写入两次参考。 你可以看到在Java输出stream文档(性能)。

你应该使用writeUnshared(),它会在每次写入时创build一个新的对象

我看到重置被build议,这会得到相同的结果,但它有性能影响。