gpt4 book ai didi

java - ObjectStream 中可变对象的影响

转载 作者:行者123 更新时间:2023-12-02 11:37:53 25 4
gpt4 key购买 nike

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

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 值 - 质量总是被正确接收,但是每秒最多可以改变 50 次的 hp 没有被正确接收(通常被接收为大约 97,无论原始物体的实际 hp 是多少)。我在发送数据包之前以及数据包一到达就检查了 hp 的值,它似乎只是随机更改,但我认为这可能是由于 p.foo 是一个指针这一事实,就像当我改为进行深层复制:

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

代码似乎通过 hp 发送得非常好,那么 Streams 是否必须传递未变异的对象?有没有什么好的方法可以在java中强制执行此操作?

最佳答案

我写的有关 ObjectOutpuStream 的所有内容也发生在 ObjectInputStream 中。

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

出于同样的原因,您迟早会遇到 OutOfMemoryError,因为 ObjectOutputStream 的内部缓存会变得越来越大(没有 reset 你可以打电话)。

因此,我认为您可以通过使用与 ObjectOutputStream 不同的东西来更改实现,或者实例化一个新的 ObjectOutputStream (您需要在接收端执行此操作,如下所示)好吧)发送一些东西后。

关于java - ObjectStream 中可变对象的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48793651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com