отправить сериализуемый объект через сокет

У меня странная проблема с отправкой сериализуемого объекта, который я создал через сокет. На самом деле, если я запускаю сервер и клиент на одной машине, он работает хорошо, но если сервер и клиент находятся на разных машинах, прочитанный объект на стороне сервера пуст (с размером, равным нулю)

У кого-нибудь есть идея исправить это? (код ниже)

Сервер:

public static void main () {
...
InputStream is = mysocket.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);

ArrayList<MyObject> list_of_object;
list_of_object = (ArrayList<MyObject>) ois.readObject();
logger.log(Level.INFO,"object readen with size : "+list_of_object.size());
...
}

Клиент:

public static void main () {
...
ObjectOutputStream oos = new ObjectOutputStream(mysocket.getOutputStream());
oos.writeObject(list_of_object);
...
}

person user1027336    schedule 05.11.2012    source источник
comment
Что делает этот метод size() в вашем объекте? И что значит прочитанный объект на стороне сервера пустой (с размером равным нулю)? Вы должны больше деталей и объяснений.   -  person Bhesh Gurung    schedule 05.11.2012
comment
Мой объект представляет собой ArrayList, поэтому это метод размера объектов ArrayList (возвращает количество элементов в списке)   -  person user1027336    schedule 05.11.2012
comment
Если вы пишете/читаете ArrayList, то почему вы приводите читаемый объект к MyObject.   -  person Bhesh Gurung    schedule 05.11.2012
comment
Я написал это так просто для простоты. MyObject заменен в моем коде на: ArrayList‹my_serisable_object›   -  person user1027336    schedule 05.11.2012
comment
Вы упростили до такой степени, что удалили код, показывающий проблему. Попробуйте опубликовать свой реальный код или, по крайней мере, урезанную версию, которая действительно демонстрирует проблему.   -  person user207421    schedule 06.11.2012
comment
Хорошо, чтобы быть более понятным, я изменил код   -  person user1027336    schedule 06.11.2012
comment
Если вы получили пустой список, вы отправили пустой список. Этот код не демонстрирует эту проблему.   -  person user207421    schedule 09.03.2015


Ответы (1)


Попробуйте следующий тестовый пример с вашей версией класса MyObject. Это поможет вам разобраться в проблеме. Если это нормально работает с вашим классом, то это может быть сетевой уровень, например. вы читаете что-то другое, чем то, что вы ожидаете прочитать. Распространенные ошибки могут заключаться в том, что вы где-то используете старую версию кода вашего сервера, и вы действительно можете прочитать пустой список MyObjects.

import static org.junit.Assert.assertEquals;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;

import org.junit.Test;

public class StreamTest {

public static class MyObject implements Serializable {

}

@Test
public void test() throws Exception {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    ArrayList<MyObject> list_of_object = new ArrayList<MyObject>();
    list_of_object.add(new MyObject());
    oos.writeObject(list_of_object);

    byte[] whatGoesOverWire = baos.toByteArray();
    ByteArrayInputStream bais = new ByteArrayInputStream(whatGoesOverWire);
    ObjectInputStream ois = new ObjectInputStream(bais);
    ArrayList<MyObject> deserialized = (ArrayList<MyObject>) ois
            .readObject();
    assertEquals(1, list_of_object.size());
    assertEquals(1, deserialized.size());
}

}
person mhaller    schedule 06.11.2012