你的位置:首页 > Java教程

[Java教程]关于对象流两端的数据不一致的问题:

关于对象流两端的数据不一致的问题:下图为服务器端收发数据时的状态:此时players列表中有两个对象但是到客户端接收时,却只有一个对象了,经过多次测试,发现每次只有GameMessage这个类有问题,所以排除多种可能,最终确定是序列化时的问题。原因如下:GameMessage这个类中有players这个ArrayList对象的引用,该引用在调用带参数的构造方法时被赋值,以下该构造函数:
public GameMessage(ArrayList<Player> players, Point food){  super();  //this.players = players;  //this.players.addAll(players);  for(Player player : players)  {    this.players.add(new Player(player));  }  //this.food = food;  this.food = new Point(food);}

没修改前是把本类中的引用指向了堆中的原有对象,那么此时在堆中只有唯一的一个对象,在对象流进行多次序列化时,会认为是同一个对象在进行序列化,从而不会多次序列化,而是只输出第一次序列化时的那个编号,那么每次收到时其实只能反序列化出第一次发送过来的那个players列表了!

修改之后,每次赋值都新建一个对象,那么每次序列化时JVM都会重新序列化players列表,此时输出端的数据就正常了。 具体原理如下:(java疯狂讲义) 服务器端发送数据时状态(此时players列表中有两个玩家):

 此时客户端接受处在等待(卡在read语句):
   客户端接收到数据时的状态(此时的players列表只有一个玩家了):