まあ、おそらくそのように破損していません。
だから、少し背景。最近、Red5を搭載したゲームをred5のWindowsビルドからDebianSqueezeで実行されているものに移動しました。共有オブジェクトを使用して、利用可能なさまざまなゲームのリストを維持するゲームロビーがあります。
単一のゲームは、SharedObjectのgame_idに対してHashMap [String、Object]として保存されます。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);
ここで成功すると常にfalseが返されます。ゲーム用に新しいHashMapを作成し、古いものから各プロパティをコピーして、プレーヤーを省略して投票する場合は問題ありませんが、何をしようとしても、配列を維持することはできません。ListとVectorでもこれを試しましたが、同じ結果になりました。これはJavaとの最初の接触であり、プリミティブintではなくIntegerのクラスインスタンスのみを追加するように注意しましたが、すべての努力のためにアイデアが不足しました。
Windowsで完全に実行された場合、元の実装ではArrayList[Integer]ではなくArrayList[String]を使用していました。
環境:Debian Squeeze 6.0.6 jre 1.7 Red5 1.0RC2
どんな助けや提案も大歓迎です!