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
相关产品推荐
相关产品推荐

