2010-06-26 41 views

回答

8

最简单的方法可能使用serialization。因此,你的对象类必须实现可序列化,所以有所有的成员(原始和大多数标准的Java类已经这样做)。这允许在运行时在对象实例和字节流之间进行映射。

您还需要一个transer协议。你可以看看RMI,如果你不想通过线路处理你的字节流,虽然这并不困难。 然而,使用RMI允许您稍后构建更强大的分布式Java应用程序。

+0

我正在通过线路寻找串流字节流的帮助。你能提供一些参考吗? – Jus12 2011-03-07 21:18:37

+0

RMI是旧的,无法处理与系统中的NAT回调 – user3224416 2015-07-08 15:32:28

7

ObjectOutputStream/ObjectInputStream。

整个逻辑大致如下。根据您的应用程序的需求进行调整。

发送:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ObjectOutputStream oos = new ObjectOutputStream(baos); 
oos.writeObject(objectToSend); 
oos.close(); 

byte[] bytes = baos.toByteArray(); 
socket.write(bytes); 

接收:

ObjectInputStream ois = new ObjectInputStream(socketInputStream); 
MyObject mo = (MyObject)ois.readObject(); 
+1

是否有一个原因,你写数据到ByteArrayOutputStream而不是直接到SocketOutputStream? – meriton 2010-06-26 18:11:03

+1

没有特别的理由。这只是我通常分割序列化和发送/归档/存储到数据库部分,所以我通过字节[]。正如我在另一个答案中提到的,序列化数据可能不是消息的唯一部分;我可以添加签名,路由,逻辑所需的任何其他内容 – 2010-06-27 14:29:58

3

这取决于:

如果另一个端点是Java那么Java序列化可能实现的最快方式。但是支持Java序列化的注意事项并不是一项简单的任务,而且可能会随着时间的推移而变得很麻烦。只是谷歌“Java序列化陷阱”的一些例子。

如果其他端点不是Java或未来的可维护性和兼容性是一个目标,那么我会建议更广泛的可重复使用的编码。 为此,我会考虑Google Protocol Buffers或Apache Thrift(我只能发布1个超链接)。

当然,总会有使用XML来编码你的对象的选项。 :)

个人来说,在我们的项目中,我们一直在使用谷歌协议缓冲器,在我看来,不能被打败的易用性,可维护性,并在我们的情况下,最重要的,协议缓存版本之间的兼容性。

0

如果你是在多平台环境中,你可以使用CORBA。虽然它有点复杂,因为您可能需要控制两个端点并实现接口定义语言(IDL)绑定。

一个好的方法是使用JSON。您只需将JSON结构映射到您的Java对象。