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议,这会得到相同的结果,但它有性能影响。