ObjectStream 中可变对象的影响

Effects of Mutable objects in an ObjectStream

我正在尝试使用从套接字获得的 ObjectInputStream 和 ObjectOutputStream 在客户端和服务器之间发送数据包。然而,我在尝试将对象发送到流中时得到了一些奇怪的结果,我的 class 结构看起来如下所示:

public class Packet {
  public Foo foo;
}

public class Foo {
  public float hp = 100;
  public double mass = 10;
  public void takeDamage(float dmg) {
    hp -= dmg;
    Packet p = new Packet();
    p.foo = this;
    //code to send packet to server
  }
}

但是我发现服务器在 Foo 到达时接收到不同的值 - 质量总是被正确接收但是 hp,每秒最多可以变化 50 次,没有被正确接收(它通常被接收大约为 97,无论原始对象的实际 hp)。我在发送数据包之前和它一到达就检查了 hp 的值,它似乎只是随机更改,但我认为这可能是由于 p.foo 是一个指针,因为当我而是制作一个深拷贝:

p.foo = new Foo();
p.foo.hp = hp;
p.foo.mass = mass;

代码似乎可以完美地通过 hp 发送,那么流是否必须传递未变异的对象?在 java?

中有什么好的方法可以强制执行此操作吗?

我写的关于 ObjectOutpuStream 的一切也发生在 ObjectInputStream

ObjectOutputStream 缓存先前序列化的数据,以便在同一实例再次序列化时仅发送引用而不是整个数据。这使得序列化循环数据结构而不会陷入无限循环成为可能。我想这就是为什么您收到一个不同的值(很可能是序列化的第一个值)而不是当前值的原因。

同样的道理你迟早会运行变成一个OutOfMemoryError因为ObjectOutputStream的内部缓存会越来越大(没有reset 你可以打电话)。

所以我想你可以通过使用不同于 ObjectOutputStream 的东西来改变你的实现,或者你在发送后实例化一个新的 ObjectOutputStream (你也需要在接收端这样做)东西。