在java中,如何通过tcp/ip网络连接发送用户定义的类对象?

在java中,如何通过tcp/ip网络连接发送用户定义的类对象?,java,networking,user-defined-types,Java,Networking,User Defined Types,这是我希望从客户端应用程序发送到服务器应用程序的用户定义类的示例: class dataStruct implements Serializable{ byte data; int messageNum; public void setData(byte datum, int messageNumber){ data=datum; messageNum=messageNumber; } } 在java中,如何通过tcp/ip连接发

这是我希望从客户端应用程序发送到服务器应用程序的用户定义类的示例:

class dataStruct implements Serializable{
    byte data;
    int messageNum;
    public void setData(byte datum, int messageNumber){
        data=datum;
        messageNum=messageNumber;
    }
}
在java中,如何通过tcp/ip连接发送用户定义的类

我可以使用什么类型的流来实现这一点(如果我发送的不仅仅是文本)

我可以通过套接字流传递一个完整的对象,还是在它通过流传递之后,我总是必须强制转换它

我正在编写一个服务器/客户机应用程序,我只能找到通过网络连接传递的基本类型或字符串示例的教程,而不是用户定义的类型


非常感谢您的帮助和指导。

在发送端使用ObjectOutputStream,在接收端使用ObjectInputStream

更清楚一点,这里是一个示例(没有任何异常处理)

发送方:

dataStruct ds = ...;
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(ds);
oos.close();
接收方:

ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
Object o = ois.readObject();
if(o instanceof dataStruct) {
   dataStruct ds = (dataStruct)o;
   // do something with ds
}
else {
   // something gone wrong - this should not happen if your
   // socket is connected to the sending side above.
}
因此,是的,您必须在接收端强制转换,以便编译器知道正确的类。(强制转换不会更改对象的类,只会更改编译器对它的了解。)

此序列化还可用于将对象保存到文件中。
当然,这只为Java提供了互操作性,如果您有非Java合作伙伴,您可能希望使用自定义序列化协议或一些基于XML的格式。

让对象实现可序列化的标记接口,然后使用
ObjectOutputStream
ObjectInputStream
传输对象。当对象从另一端出来时,它将通过
ObjectInputStream
上的
readObject()
方法返回
object
,因此是的,您需要将其转换为正确的类型。

我将使用JAXB over HTTP。毕竟现在是2011年。不要惩罚自己。@Kevin:只有当服务器已经在HTTP服务器中时,这才有帮助。@Paulo:没错,如果使用spring-mvc,将服务器切换到HTTP大约需要2-3个小时的投资。这假设客户端和服务器端都知道该类。是的,当然。如果还不知道,你要么需要让别人知道(就像RMI那样),要么想想还有什么需要转移。