You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UDP文件传输接收器TCP重复接收TransferInfo对象问题求助

Java UDP文件传输中Receiver重复读取同一TransferInfo对象的问题

问题原因

Java的ObjectOutputStream自带对象引用缓存机制:如果Sender端复用同一个TransferInfo对象实例,仅修改其内部的数据包编号列表,那么第一次调用writeObject时会完整序列化该对象并发送;后续调用writeObject时,只会发送该对象的引用标识,而非最新的对象内容。Receiver端的ObjectInputStream收到引用后,会直接返回之前反序列化得到的对象实例,因此每次读取到的都是第一次的内容。

解决办法

有两种直接有效的修复方式:

  • 每次创建新的TransferInfo实例:Sender在每次需要发送数据包编号列表时,新建TransferInfo对象,将最新的编号列表赋值给新对象后再执行writeObject操作。这样每次发送的都是全新对象,ObjectOutputStream会完整序列化新对象的当前状态。
  • 重置ObjectOutputStream缓存:若必须复用TransferInfo对象,可在每次调用writeObject后,执行out.reset()(out为ObjectOutputStream实例),清空其对象引用缓存。这样下次writeObject时会重新序列化对象的最新状态,而非发送引用。

验证方式

可在Sender端打印每次发送的TransferInfo对象的系统哈希值(System.identityHashCode(transferInfo)):如果哈希值相同,说明复用了同一对象;若哈希值不同,则是新创建的对象。Receiver端也可打印接收对象的哈希值,确认是否为同一实例。

内容的提问来源于stack exchange,提问作者Dexter2587

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 15:35:03