我发送一个可通过套接字创建的可序列化对象有一个奇怪的问题。事实上,如果我在同一台机器上运行服务器和客户端它运行良好,但如果服务器和客户端在不同的机器上,服务器端的重新定义对象是空的(大小等于零)
任何人都有想法解决这个问题? (代码如下)
服务器:
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);
...
}
答案 0 :(得分:0)
使用您的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());
}
}