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

man*_*iak 13 java sockets serialization

我正在编写一个基于套接字的程序.我使用类ModelEvent通过套接字传递信息.在ModelEvent中,有一个类型(Object)的变量对象.

对象本身是具有一些值的2D数组.

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

object[2][3] = 2;
ModelEvent event2 = new ModelEvent("you", object);
dispatchEvent(event2);
Run Code Online (Sandbox Code Playgroud)

假设数组对象填充了值1.客户端收到第一个事件(事件),数据是正确的.通过数据发送的第二个事件是不对的.其数据与第一次发送时的数据相同."allo"和"you"是为了看我是不是两次读同一个事件而答案不是.字符串是正确的,但对象不是,如果已更新,则为event.我在发送第二个事件之前迭代数组,以查看它是否在服务器端更新,它是.但在客户端,它仍然与第一次发送时相同,即使事件本身已更改.

old*_*inb 25

ObjectOutputStream.reset.

重置将忽略已写入流的任何对象的状态.状态重置为与新状态相同ObjectOutputStream.流中的当前点被标记为重置,因此相应的ObjectInputStream将在同一点重置.先前写入流的对象将不会被称为流中的对象.它们将再次写入流中.

/* prevent using back references */
output.reset();
output.writeObject(...);
Run Code Online (Sandbox Code Playgroud)

在写入相同对象之前调用reset,以确保其序列化已更新状态.否则,它将仅使用对具有其过时状态的先前写入对象的后引用.

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

写一个"非共享"对象ObjectOutputStream.此方法与此方法相同writeObject,只是它始终将给定对象写入流中的新唯一对象(而不是指向先前序列化实例的后引用).

特别:

  • 通过writeUnshared写入的对象总是以与新出现的对象(尚未写入流的对象)相同的方式序列化,无论该对象是否先前已被写入.

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

虽然编写对象via writeUnshared本身并不保证对象在反序列化时对该对象的唯一引用,但它允许在流中多次定义单个对象,这样readUnshared接收者的多次调用不会发生冲突.请注意,上述规则仅适用于使用的基础级对象writeUnshared,而不适用于要序列化的对象图中的任何可传递引用的子对象.

output.writeUnshared(...);
Run Code Online (Sandbox Code Playgroud)

请注意,将此与之结合起来是一种很好的做法ObjectInputStream.readUnshared.

从中读取"非共享"对象ObjectInputStream.此方法是相同的的readObject,不同之处在于它可以防止后续调用readObjectreadUnshared从返回附加引用的方式从这个呼叫中获得的反序列化实例.

特别:

  • 如果readUnshared调用反序列化反向引用(先前已写入流的对象的流表示),ObjectStreamException则将抛出
  • 如果readUnshared成功返回,则任何后续反序列化对反序列化的流句柄的反向引用的尝试readUnshared都将导致ObjectStreamException抛出.

反序列化对象通过readUnshared使与返回对象关联的流句柄无效.请注意,这本身并不总能保证返回的引用readUnshared是唯一的; 反序列化对象可以定义readResolve返回对其他方可见的对象的方法,或者readUnshared可以返回在流中的其他地方或通过外部手段可获得的Class对象或enum常量.如果反序列化对象定义了一个readResolve方法,并且该方法的调用返回一个数组,则readUnshared返回该数组的浅层克隆; 这保证了返回的数组对象是唯一的,并且无法在调用readObject或readUnshared上第二次获取ObjectInputStream,即使已经操作了基础数据流.

obj = input.readUnshared();
Run Code Online (Sandbox Code Playgroud)

  • 我现在想吻你!*没有同性恋*谢谢.只是为了理解,当一个对象被发送两次到流时,它会记住它以前的状态并使用旧状态吗? (4认同)