Отправка класса, содержащего коллекцию, через сетевой поток - PullRequest
0 голосов
/ 18 ноября 2011

Я хочу отправить через ObjectStream объект класса: (Packet is Serializable)

public class ServerPlayersListPacket extends Packet {

    private static final long serialVersionUID = -7141960214853425631L;

    private ArrayList<Player> players;


    public ServerPlayersListPacket(ArrayList<Player> players) {
        this.setPlayers(players);
    }


    public ArrayList<Player> getPlayers() {
        return new ArrayList<Player>(Collections.synchronizedList(players));
    }


    public void setPlayers(ArrayList<Player> players) {
        this.players = players;
    }
}

Но есть проблема с ArrayList. Получая его с другого сайта, я получил OptionalDataException.

Я обнаружил, что это проблема, связанная с ArrayList синхронизацией. Но как заставить это работать?

Ответы [ 2 ]

0 голосов
/ 30 ноября 2011

Мой трюк:

  1. отправить начальный пакет ServerPlayersListInitPacket
  2. отправка ServerNextPlayerPacket в цикле с одним Player за Packet

Это решение также позволяет клиентскому сайту динамически обновлять список игроков, что более плавно.

0 голосов
/ 18 ноября 2011
  1. ArrayList не синхронизирован. Вектор есть.

  2. Для потоковой передачи необходимо, чтобы поля были сериализуемыми, а не синхронизированными. Попробуйте включить разные поля с помощью «переходного процесса», так что вы найдете проблемное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...