我有一个Position类,我在多个客户端和服务器之间进行序列化。我有一个名为GameWorld的类,它包含对象位置的数组。例如,玩家位置是位置数组。每个客户端都有自己的GameWorld实例,服务器也是如此。
在客户端,客户端的播放器位置被序列化并发送到服务器。在服务器端,4个位置的数组记录4个玩家的位置,并将3个其他玩家的位置发送给每个玩家。当我直接从GameWorld类序列化位置或位置数组时,每个ObjectInputStream Position或Position []似乎都保留其初始值,而不考虑玩家的移动。
但是,如果我将一个新的位置或位置[]作为GameWorld成员变量的副本,它可以完美地运行,并且玩家可以实时看到彼此的移动!这将是问题的解决,但我预见,当我有数十个(如果不是数百个)要序列化的职位时,复制效率低下将会遇到麻烦。
总结一下这个问题,是什么阻止我直接从GameWorld类序列化我的位置数据结构?为什么我必须在将其写入ObjectOutputStream之前将其复制?
这样可行:
Position [] temp = new Position[4];
for(int i = 0; i < 4; i++)
{
temp[i] = server.realWorld.diggaPoses[i];
}
positionOOS.writeObject(temp);
positionOOS.flush();
这不起作用:
positionOOS.writeObject(server.realWorld.diggaPoses);
positionOOS.flush();
为了澄清,我在“服务器”实例中的GameWorld实例被称为“realWorld”。
答案 0 :(得分:0)
positionOOS.writeObject(server.realWorld.diggaPoses);
试试这个:
positionOOS.writeUnshared(server.realWorld.diggaPoses);
或:
positionOOS.reset();
positionOOS.writeObject(server.realWorld.diggaPoses);
请参阅Javadoc了解原因。