【问题标题】:send a serializable object over socket通过套接字发送一个可序列化的对象
【发布时间】:2012-11-05 15:38:01
【问题描述】:

发送通过套接字创建的可序列化对象时遇到一个奇怪的问题。事实上,如果我在同一台机器上运行服务器和客户端,它工作得很好,但是如果服务器和客户端在不同的机器上,服务器端的读取对象是空的(大小等于零)

任何人有解决这个问题的想法吗? (代码如下)

服务器:

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);
...
}

【问题讨论】:

  • 对象中的size() 方法有什么作用? “服务器端的已读对象为空(大小为零)”是什么意思?你应该更多的细节和解释。
  • 我的对象是一个 ArrayList 所以它是 ArrayList 对象的 size 方法(返回列表中元素的数量)
  • 如果你正在写/读ArrayList那你为什么要把读对象转换成MyObject
  • 我这样写只是为了简单。 MyObject 在我的代码中被替换为:ArrayList
  • 您已经过度简化,以至于您删除了显示问题的代码。尝试发布您的真实代码,或者至少是实际存在问题的精简版本。

标签: java sockets serialization remote-server objectinputstream


【解决方案1】:

使用您的MyObject-class 版本尝试以下测试用例。它将帮助您找出问题所在。如果这适用于您的课程,那么它可能是网络层,例如您正在阅读的内容与您期望阅读的内容不同。常见的错误可能是您在某处运行旧版本的服务器代码,而您可能确实读取了一个空的 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());
}

}

【讨论】:

    猜你喜欢
    • 2011-06-21
    • 2011-11-26
    • 2011-05-14
    • 1970-01-01
    • 2017-04-24
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    相关资源
    最近更新 更多