2013-12-05 3 views
1

У меня возникают проблемы при попытке получить 2-d/массив String через ObjectOutputStream. Мой код для отправки массива является:Deserializing объектов, отправленных через ObjectOutpoutStream

String [][] sendable = new String [n][5]; 
ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream()); 
os.writeObject(sendable); 

Предположим, мой массив инициализируется со всеми значениями, как я могу распаковать полученные данные обратно в 2-й массиве? Мой первый подход заключался в этом, но это вызывало проблемы, поскольку я относительно новичок в программировании на Java и сокетах.

ObjectInputStream ois =new ObjectInputStream(clientSocket.getInputStream()); 
String insa[][] = null;   

try{ 
    insa= (String[][]) ois.readObject(); 
} catch (ClassNotFoundException ex){ 
    ex.printStackTrace(); 
} 

System.out.println(insa[0][1]); 

Как получить 2-мерный массив, отправленный как объект?

+0

С первого взгляда, это должно сработать. Какие проблемы вы видите? – lreeder

+0

Клиентское приложение не отвечает после объявления objectinputstream. он как бы застрял в цикле while, ожидающем ввода – user3070524

+0

Я предлагаю, что он застрял в конструкторе ObjectInputStream. – EJP

ответ

-1

Я предлагаю промывке ОС после написания sendable:

os.writeObject(sendable); 
os.flush(); 

Возможно, вы также хотите позвонить os.flush() сразу после того, как конструктор в соответствии с рекомендациями официальной документации:

Создает ObjectOutputStream, который пишет к указанному OutputStream. Этот конструктор записывает заголовок потока сериализации в базовый поток; вызывающие абоненты могут захотеть немедленно очистить поток, чтобы гарантировать, что конструкторы для приема ObjectInputStreams не будут блокироваться при чтении заголовка.

См http://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html#ObjectOutputStream%28java.io.OutputStream%29

+0

Ненужное с этим кодом. Если бы был BufferedOutputStream, вы были бы правы. – EJP

+0

ObjectOutputStream не BufferedOutputStream, но он имеет внутренний буфер. Именно поэтому он реализует интерфейс Flushable и предоставляет метод flush(). См. Http://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html#flush%28%29 – Dario

+0

Конечно, но вам не нужно промывать после вызова writeObject(). – EJP

0
  1. Вы должны построить ObjectOutputStream до ObjectInputStream, на обоих концах. В противном случае сверстники могут затормозить чтение заголовка потока объектов.

  2. Вам необходимо сконструировать оба потока один раз для жизни сокета, а не один раз для отправки или получения.

Смежные вопросы