gpt4 book ai didi

java - ObjectInputStream 不会从输出流中读取所有对象

转载 作者:行者123 更新时间:2023-12-02 02:07:42 24 4
gpt4 key购买 nike

我正在尝试通过套接字将对象从服务器发送到渲染客户端。第一个实体对象列表由 8 个实体组成,但列表中还添加了更多实体。我的服务器最终可以将数百个对象写入 ObjectOutputStream,但客户端只能读取最初的 8 个。

我尝试在 writeObject 方法之前和之后调用flush(),但这似乎没有什么区别。我已将问题范围缩小到客户端。

服务器使用以下方法将 ArrayList 写入流:

private void sendEntities() {
try {
ArrayList<Entity> entities = engine.requestEntities();
System.out.println("Entities sent: " + entities.size());
objectOut.writeObject(entities);
// objectOut.flush(); Does not fix the problem
} catch (IOException e) {
e.printStackTrace();
}
}

客户端读取对象并将其返回给 setter 方法,该方法将它们绘制在屏幕上,但这是尝试从流中读取对象的唯一区域。

private ArrayList<Entity> requestEntities() {
try {
out.writeUTF("REQ_ENT()");
// The client only receives 8 entity-objects every time
ArrayList<Entity> entitiesReceived = (ArrayList<Entity>) objectIn.readObject();
in.readUTF();
return entitiesReceived;

} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

return null;
}

我希望从输入流读取的对象列表与写入输出流的对象数量相匹配,但从输入流读取的列表保持不变。第一次调用 requestEntities() 时它会按预期工作,但在后续调用中则不会。

编辑:已添加 github 存储库的链接

编辑 2:ObjectOutputStream 发送对先前发送的对象的引用,正如 Johannes Kuhn 所指出的。我添加了一行代码,似乎已经解决了这个问题。我制作了实体列表的副本,并将该副本写入流中。

private void sendEntities() {
try {
ArrayList<Entity> entities = engine.requestEntities();
ArrayList<Entity> copy = new ArrayList<>(entities);
System.out.println("Entities sent: " + entities.size());
objectOut.writeObject(copy);
} catch (IOException e) {
e.printStackTrace();
}
}

Link to github repository

最佳答案

问题在于,ObjectStreams 会跟踪已发送的对象,并且不会再次发送它们,而是只会引用前一个对象。

制作 ArrayList 的副本并发送新的 ArrayList。

tl;dr:序列化不适用于服务器/客户端通信。

关于java - ObjectInputStream 不会从输出流中读取所有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57349440/

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