通过Socket通过网络发送序列化的自定义对象

时间:2015-03-14 09:47:12

标签: java sockets serialization network-programming client-server

我正在编写基本的服务器/客户端代码,以便使用套接字通过网络发送一些自定义对象。

我的自定义对象还有一些其他已初始化的自定义字段 例如 ```

public class CustomObject implements Serializable {
    private ONE one = new ONE();        //ONE implements Serializeable
    private TWO two = new TWO();        //TWO implements Serializeable
    private THREE three = new THREE();  //THREE implements Serializeable
    String somestring = "piday";
    ....
    @Override
    public String toString() {
        return somestring + one;
    }
}

```

客户端,我正在写这样的对象: ```

Socket s = new Socket(HOST,PORT);
new ObjectOutputStream(s.getOutputStream())
    .writeObject(machine);

并在服务器上接收它们,如下所示:

ServerSocket server = new ServerSocket(PORT);
try (Socket s = server.accept();
     ObjectInputStream inputStream = new ObjectInputStream(s.getInputStream())) {
            CustomObject machine = (CustomObject) inputStream.readObject();
            System.out.println(machine);
        } catch (ClassNotFoundException e) {
            System.err.println("Err! Could not cast");
        }

现在,在服务器端,所有内容都运行没有任何错误,所以,当我调试时,我看到一个,两个和三个自定义对象 NULL ,但不是基本字符串 somestring

在这个例子中,我错过了什么或做错了什么?

请注意 ONE,TWO和THREE类型定义也会实现Serializable
服务器和客户端均可访问所有自定义类定义

2 个答案:

答案 0 :(得分:0)

我认为,最好的方法是首先序列化我们的对象(到JSON或XML)。然后将此输出字符串转换为字节(可选)并通过套接字发送,另一方面,反转这些步骤以使对象恢复。

此过程允许您在将来实施加密(如有必要)。

答案 1 :(得分:0)

Java Serialization是一个非常强大的协议。 java.io.ObjectOutputStream和java.io.ObjectInputStream是更高级别的类,当然用较低级别的类包装,例如FileInputStream和FileOutputStream。我的问题是,为什么你希望在对象中读取整个文件时逐字节读取文件。

以下是该程序的一个很好的解释。

http://www.tutorialspoint.com/java/java_serialization.html