Enviar ArrayList<String> por Socket, esta correto?

Estou tentando enviar um ArrayList de String pelo socket, esta correto esse método de envio?
Não sei como receber ele pelo cliente… Alguém,por favor, me da uma luz?

[code] public void ListaDeUsuarios(ArrayList<String> listaUsuarios, Socket socket) {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream dos = new ObjectOutputStream(bos);
dos.writeByte(2);
dos.writeObject(listaUsuarios);
byte[] msg = bos.toByteArray();

        DataOutputStream out = new DataOutputStream(socket.getOutputStream());
        out.writeInt(msg.length);

        out.write(msg);
        out.flush();
     
        System.out.println("@Encoder/Server/Bytes de Array Enviados para " + socket.getInetAddress().getHostName());

    } catch (Exception e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
    }

}[/code]

No cliente, eu tenho isso aqui :

[code]@Override
public void run() {
while (stopRunning == false) {

        try {
            
            if ((socket.isClosed() == true) || (socket.isConnected() == false)) {
                stopRunning = true;
                break;
            }
            
            DataInputStream dis = new DataInputStream(socket.getInputStream());
            
            int tamanho = dis.readInt(); // Read Int,
            int tipoMensagem = dis.read(); // Tipo de mensagem

            System.out.println("Cliente*Tamanho DIS : " + tamanho);
            System.out.println("Cliente*TipoMensagem DIS : " + tipoMensagem);
            
            switch (tipoMensagem) {
                
                case 0:
                    String mensagemComumPreta = decoding.mensagemComumPreta(dis, tamanho);
                    mainController.getMainviewFrontController().receberMensagemParaMainView(mensagemComumPreta);
                    break;
                
                case 1:
                    String mensagemColorida = decoding.mensagemColorida(dis, tamanho);
                    break;
                
                case 2:
                    decoding.decodeUserList(dis, tamanho);
                    break;
                
                case 3:
                    decoding.notImplemented(dis, tamanho);
                    break;
                
                case 4:
                    decoding.notImplemented(dis, tamanho);
                    break;
                
                case 5:
                    decoding.notImplemented(dis, tamanho);
                    break;
                
                case 6:
                    decoding.notImplemented(dis, tamanho);
                    break;
                
                case 7:
                    decoding.mensagemDeErro(dis, tamanho);
                    mainController.getMainviewFrontController().hideLoadingGif();
                    break;
                
                case 8:
                    decoding.mensagemDeErroDeLogin(dis, tamanho);
                    mainController.getMainviewFrontController().hideLoadingGif();
                    break;
                
                case 9:
                    decoding.mensagemDeSucessoDeLogin(dis, tamanho);
                    mainController.getMainviewFrontController().hideLoadingGif();
                    break;
                
                case 10:
                    decoding.notImplemented(dis, tamanho);
                    break;
                default:
                    System.out.println("@Receiver-Client Failure Detected! - Wrong Protocol ? notLogged?");
                    System.out.println("Protocol Received : " + tipoMensagem);
                    decoding.notImplemented(dis, tamanho);
                    mainController.getMainviewFrontController().hideLoadingGif();
                    break;
            }
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
            closeConnection();
        }
    }
}[/code]