关于对象流两端的数据不一致的问题:

关于对象流两端的数据不一致的问题:
下图为服务器端收发数据时的状态:此时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列表只有一个玩家了):
 
posted @ 2017-08-29 09:09  ~~晴天~^.^  阅读(366)  评论(0编辑  收藏  举报