通过网络传输Java对象的最佳方法是什么

时间:2009-12-02 16:22:08

标签: java json remoting

我正在尝试将特定类的对象从一个服务器传输到另一个服务器。

我正在看的选项是:

  • 将数据序列化为JSON并发送 它通过使用HTTP的电线,和 在另一端反序列化。
  • 将数据序列化为某种二进制形式并使用TCP进行传输 套接字。

这方面的最佳做法是什么?有什么问题?

理想情况下,我希望对接口进行版本控制,因此可以单独升级发送方和接收方。

我正在考虑使用JSON方法,因为我已经有了将对象序列化/反序列化为JSON的代码。

8 个答案:

答案 0 :(得分:6)

每当我需要传输Java对象时,假设有类似的JVM版本,我总是使用普通的Java序列化(Sun official tutorial):它更简单,你不必关心项目或聚合的传输链,因为序列化已经关心它(如果你正确实施)。

因此,如果你想传输一个由许多子对象构成的复杂对象,你不必拆分它,发送它并重新组合它:你只需要发送对象,它已经包含了已经包含的所有内容。

修改

关于RMI:我将它与序列化一起使用,它就像一个魅力!我曾经开发远程摆动(通过TCP发送JPanels)..

  1. RMI可以帮助您调用远程方法并从主服务器获取对象
  2. 客户端可以使用序列化(通过不同的套接字)发送回对象或将它们作为参数传递给RMI调用,这应该是个人偏好
  3. 当然我不知道你想要做什么,但这两种工具都很好用,也可以正交使用。

答案 1 :(得分:5)

如果两端都是用Java编写的,那么只需使用Java自己的序列化。

另一方面,使用JSON,XML或YAML将使调试更容易,因为传输的内容将是可读的。

答案 2 :(得分:4)

我知道这个帖子现在已经老了,但我刚刚碰到它,并认为为了未来读者的利益我会投入2美分......

除非出于某种原因需要JSON,否则实际上不需要2个应用程序使用它进行通信。我同意上面的Avro建议。 Avro允许您编写业务逻辑代码,它可以为您处理序列化/反序列化。它将生成一个服务器端接口来实现(基于您提供的模式)和客户端代理存根来调用服务。如果需要,它也可以序列化为其他格式。

没有太多的指导文档或示例,但这里有几个体面的看法:

以下是使用套接字服务器的教程: http://gbif.blogspot.com/2011/06/getting-started-with-avro-rpc.html

这是一个使用Avro over http的开源项目/演示: http://code.google.com/p/avro-http-example/

答案 3 :(得分:3)

我建议使用带有JSON编码的Avro;在使用HTTP和JSON时,您将获得所需的版本控制支持,并且您不必自己编写序列化/反序列化代码。有关Avro功能的简要说明,请参阅http://hadoop.apache.org/avro/docs/current/spec.html,如果您遇到任何问题,请在邮件列表中添加注释或加入Freenode上的#avro频道。

答案 4 :(得分:1)

一些选项:

  • 如果您需要通过公共网络执行此操作,请使用json http方法,因为您不会遇到防火墙问题 - 您可以通过端口80
  • 如果您在Intranet上以最快的方式执行此操作(从设置和可维护性的角度来看)可能是老式的Java rmi,这只需要您定义远程接口并连接到rmi服务器,您可以在几分钟内启动并运行,并且可以毫不费力地对远程对象/服务进行持续更改。在引擎盖下,这只是使用java序列化
  • 如果您的需求对性能敏感(低延迟,高吞吐量),您可以使用类似google protocol buffers
  • 的内容
  • 另请查看Externalizable界面以了解自定义序列化

答案 5 :(得分:0)

为什么选择JSON?这通常用于Web应用程序。

创建一个可以返回所需Java对象的Web服务会更有意义。然后你不必担心序列化/反序列化它。

答案 6 :(得分:0)

您可以选择仅数据解决方案和数据加行为解决方案。

对于数据,您可以使用 JSON ,也可以使用Java的序列化。 JSON 很简单,但您必须滚动自己的类包装器。使用Java的序列化可以很好地工作,因为编组问题是众所周知的并且以一致的方式处理。其中一个变体是在本地和远程系统上提供Java类,但如果你这样做,你可以继续执行 RMI RMI 很好,因为您不必为远程端编写单独的类,但在分发对象时确实需要注意一些问题,例如确保设置类的序列号或者必须将确切的二进制类文件分发到远程系统。你可以用 RPC 来做到这一点,但是如果你走得那么远,你也可以创建一个Web服务并使用 SOAP

答案 7 :(得分:0)

多年来我尝试了很多选项或序列化/反序列化,包括JSON,XML,SOAP,protobuf以及其他一些我不好意思在这里命名: - )

现在我们几乎专门用于Java-to-Java和JS-to-Java传输的JSON编码,甚至用于存储内部数据(除非二进制数据的数量使得JSON格式效率太低)。 JSON的优点是简单,重量轻,无论是有效负载还是实现复杂性以及我们所涉及的所有语言的序列化解决方案的可用性。它还有助于拥有“标准”持久性框架。

最近Jackson对我们来说一直很好。 Jabsorb也有好的(de)序列化包。

版本控制: JSON没有内置的版本控制支持(Avro可能有一些东西),所以你必须自己运行。保持主要/次要版本编号方案通常是个好主意:主要版本号不兼容,未成年人向后兼容,因此客户端1.2可以与服务器1.5通信,但不能与服务器2.1通信。

陷阱:

  • 转换Java泛型有时很有挑战性,比如TreeMap。
  • 默认情况下,某些实现可能会嵌入实现类名,这使得协议的更改能力更低。您可能希望在线路上没有任何冗余。