我正在写一个基于套接字的程序。我正在使用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);
假设数组对象填充了值1。第一个事件(事件)由客户端接收,并且数据正确。通过数据发送的第二个事件不正确。其数据与第一次调度中的数据相同。“ allo”和“ you”是要查看我是否两次都没有读取同一事件,而答案是否定的。如果已更新字符串,则该字符串是正确的,但该对象不是该事件。我在发送第二个事件之前遍历数组,以查看它是否在服务器端被更新了。但是在客户端,即使事件本身已更改,它仍然与第一次调度中的相同。
请参阅ObjectOutputStream.reset
。
重置将忽略任何已写入流的对象的状态。状态被重置为与new相同ObjectOutputStream
。流中的当前点被标记为重置,因此相应的ObjectInputStream
点将在同一点重置。先前写入流中的对象将不会被视为已经存在于流中。它们将再次写入流中。
/* prevent using back references */
output.reset();
output.writeObject(...);
在写入同一对象之前,请调用reset以确保其更新状态被序列化。否则,它将仅使用对先前写入的对象及其过期状态的反向引用。
或者,你也可以使用ObjectOutputStream.writeUnshared
以下方法。
将“非共享”对象写入ObjectOutputStream
。此方法与相同writeObject
,除了它始终将给定对象写为流中新的唯一对象(与指向先前序列化实例的反向引用相反)。
特别:
通过writeUnshared
写入的对象始终以与新出现的对象(尚未写入流的对象)相同的方式进行序列化,而不管该对象先前是否已写入。
如果writeObject
用于写入先前使用writeUnshared
写入的对象,则将先前的writeUnshared
操作视为对单独对象的写入。换句话说,ObjectOutputStream
将永远不会产生对通过调用写入的对象数据的反向引用writeUnshared
。
虽然通过写入对象writeUnshared
本身并不能保证对对象进行反序列化时可以唯一引用该对象,但是它允许在流中多次定义单个对象,从而使readUnshared
接收方进行的多次调用不会冲突。请注意,上述规则仅适用于用编写的基本级对象writeUnshared
,不适用于要序列化的对象图中任何可传递引用的子对象。
output.writeUnshared(...);
请注意,与结合使用是一种好习惯ObjectInputStream.readUnshared
。
从中读取一个“非共享”对象ObjectInputStream
。此方法与readObject相同,不同之处在于,它防止后续调用readObject
并readUnshared
返回对通过此调用获得的反序列化实例的附加引用。
特别:
如果readUnshared
调用来反序列化反向引用(先前已写入流的对象的流表示形式),ObjectStreamException
则将抛出an
如果readUnshared
成功返回,则随后对反序列化反序列化的流引用进行反序列化的任何尝试readUnshared
都ObjectStreamException
将引发。
通过反序列化对象readUnshared
会使与返回的对象关联的流句柄无效。注意,这本身并不总是保证由返回的引用readUnshared
是唯一的。反序列化的对象可以定义一个readResolve
返回对其他方可见的对象的方法,或者readUnshared
可以返回在流中其他位置或通过外部手段可获得的Class对象或enum常量。如果反序列化的对象定义了一个readResolve
方法,并且对该方法的调用返回了一个数组,则readUnshared
返回该数组的浅表副本;这保证了返回的数组对象是唯一的,并且无法通过调用readObject
或readUnshared
再次获得该数组对象。ObjectInputStream,即使底层数据流已被操纵。
obj = input.readUnshared();
我想做一个在线绘画游戏。为此,我使用Android中的Path类,并且需要将其发送到Java服务器。为此,我尝试扩展Path类,如下所示: 为了简化事情并缩小问题的范围,我所做的只是使用outputStream.WriteObject(new SerializedPath)发送它,然后使用outputStream.flush(),其中outputStream是ObjectOutputStream的
是否有一种方法可以从数据库中读取序列化对象。ser文件并更新或删除已序列化的对象之一? 下面是我的代码,读取的对象类型'驱动程序':
我正在试验Stanford CoreNLP库,我想序列化主要的StanfordCoreNLP管道对象,尽管它抛出了一个java.io.NotSerializableException。 完整故事:每当我运行我的实现时,将管道注释器和分类器加载到内存中大约需要15秒。最终进程的内存约为600MB(很容易小到可以存储在我的机箱中)。我想在第一次创建管道后保存它,这样我就可以在以后将其读入内存。 然而,
我使用带有WebFlux的Spring boot 2.0.1作为Rest服务器。 在我RestController我想自动反序列化一个对象(产品)。但是我得到一个杰克逊错误,好像参数名称模块没有注册。 原因:com.fasterxml.jackson.databind.exc.Invalid定义异常:无法构建的实例(没有像默认构造一样的Creator):无法从对象值(没有基于委托或属性的Creat
我对对象接口的jackson序列化有问题。 我有课 哪个实现 还有上课 哪个实现 上课 我要和Jackson连载Container得到结果 但事实上我得到了结果 尽管我在映射中指定了点的序列化类型(),但在嵌套对象“point”中具有属性“name”。接口点视图没有方法getName,但结果中存在点的字段“name”。 若我从类容器中的方法getMap中删除注释(),我将得到结果 现在点没有属性"
问题内容: 我想通过套接字通道传输序列化的对象。我想将“ Hi friends”字符串作为序列化对象,然后将此对象写入套接字通道,而在另一端,我想读取相同的对象并检索数据。 我想使用Java来做所有这些事情。这该怎么做?我已经尝试过以下操作,但是在接收方没有得到任何数据。 问题答案: 您的SocketChannel处理似乎不完整,请参阅此 完整 示例以了解SocketChannel传输字节的方法: