gpt4 book ai didi

java - 为什么我每次调用 readObject 时 Java 的对象流都返回相同的对象?

转载 作者:搜寻专家 更新时间:2023-10-30 21:20:54 25 4
gpt4 key购买 nike

请原谅伪代码 - 我的无线网络已关闭,目前我无法将代码从离线计算机复制到 StackExchange。

我有两个 java 应用程序,通过 java.net.* 套接字连接。我正在尝试通过对象输入/输出流将“消息”对象从一个对象传递到另一个对象。

这是我正在做的:

Class Message implements Serializable
{
String text
int data
public Message(String txt, int dat)
{
this.text = txt;
this.data = dat;
}
string toString()
{
return text + " " + data;
}
}

服务器:

服务器有一个名为发件箱的队列

for(int i = 0; i < 1000; i++)
{

Message adding = new Message("Hello!",i);
Outbox.add(temp)
Message temp = Outbox.poll();
out.writeObject(temp);
system.out.println(temp)
}

客户:

for(int i = 0; i < 1000; i++)
{
Message temp;
temp = in.readObject()
system.out.println(temp)
}

现在我希望很明显我希望每个程序的控制台看起来都一样。相反,这就是我得到的。

服务器

Hello 0
Hello 1
Hello 2
Hello 3...

客户端

Hello 0
Hello 0
Hello 0
Hello 0...

所以看起来消息对象正在被读取但没有从流中删除。

如何疏通我的流并使它们同步,如预期的那样?

最佳答案

此问题的典型原因是多次发送相同的对象引用。对象流意味着保留对象引用身份,并且在接收端,您将在每次 readObject() 调用时得到相同的对象(即使您在发送端修改了对象!)。您的伪代码是正确的,但问题是它是否准确反射(reflect)了您的实际代码。

如果您的问题引用问题,您可以通过每次发送不同的对象实例,或使用writeUnshared() 和/或调用reset() 在每个 writeObject() 调用之间。使用writeUnshared() 将强制主对象成为接收端的新对象实例,但该对象可能引用的其他对象仍可能是共享引用。另一方面,调用 reset() 将刷新接收端的所有 缓存对象,因此接收端的所有对象引用都将是新的引用。哪一个更适合通过网络管理数据取决于您的用例,但是,对于长时间运行的流,定期调用 reset() 总是好的,因为这将释放内存会随着时间的推移而累积(这是使用对象流时常见但微妙的“内存泄漏”)。

关于java - 为什么我每次调用 readObject 时 Java 的对象流都返回相同的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8089583/

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