好吧,也许没有像这样被破坏。
所以,有点背景。我最近将我的 Red5 驱动游戏从 red5 的 windows 版本转移到了在 Debian Squeeze 上运行的游戏。我有一个游戏大厅,它使用共享对象来维护各种可用游戏的列表。
单个游戏被存储为 HashMap[String, Object] 与它在所述 SharedObject 中的 game_id 相对应。HashMap 的几个属性是 ArrayLists,特别是玩家(连接玩家 id 的 ArrayList[Integer])和投票(提交投票的玩家的另一个 ArrayList[Integer])
每当我对这些 ArrayList 中的任何一个进行更改时,某处出现问题,我无法再将 HashMap 写入 SharedObject(setAttribute 返回 false)
创建一个新游戏(服务器端):
HashMap<String, Object> game = new HashMap<String, Object>();
game.put("id", PendingGameManager.GAME_IDX);
game.put("difficulty", difficulty);
game.put("type", type);
game.put("description", this.getDescription(type, difficulty));
game.put("players", new ArrayList<Integer>());
game.put("coords", coords);
game.put("created", Calendar.getInstance().getTimeInMillis());
game.put("votes", new ArrayList<Integer>());
boolean success = this.gamesSO.setAttribute(Integer.toString(PendingGameManager.GAME_IDX), game);
这可以毫无问题地执行,并且成功返回 true。
后来我检索播放器数组并进行修改:
HashMap<String, Object> game = (HashMap<String, Object>)this.gamesSO.getMapAttribute(Integer.toString(game_id));
ArrayList<Integer> players = (ArrayList<Integer>) game.get("players");
players.add(new Integer(Integer.parseInt((user_id))));
boolean success = this.gamesSO.setAttribute(Integer.toString(game_id), game);
这里成功总是返回假。如果为游戏创建一个新的 HashMap 并从旧的属性中复制每个属性,但忽略玩家和投票,这很好,但无论尝试什么,我都无法让它维护一个数组。我也用 List 和 Vector 尝试过,结果相同。这是我第一次接触 Java,我一直很小心地只添加 Integer 的类实例而不是原始的 int,但我所有的努力都已经没有想法了。
在 Windows 上运行完美时,我的原始实现使用 ArrayList[String] 而不是 ArrayList[Integer]
环境:Debian Squeeze 6.0.6 jre 1.7 Red5 1.0RC2
任何帮助或建议将不胜感激!