Java-Serializing成员数组

时间:2014-12-22 04:58:12

标签: java arrays serialization copy

我有一个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”。

1 个答案:

答案 0 :(得分:0)

positionOOS.writeObject(server.realWorld.diggaPoses); 

试试这个:

positionOOS.writeUnshared(server.realWorld.diggaPoses); 

或:

positionOOS.reset();
positionOOS.writeObject(server.realWorld.diggaPoses); 

请参阅Javadoc了解原因。