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
(你也需要在接收端这样做)东西。
我正在尝试使用从套接字获得的 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
(你也需要在接收端这样做)东西。