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

通过网络传输Java对象的最佳方式是什么,java,json,remoting,Java,Json,Remoting,我试图将特定类的对象从一台服务器传输到另一台服务器 我考虑的选项有: 将数据序列化为JSON并发送 它使用HTTP通过网络传输,并且 在另一端反序列化 将数据序列化为某种二进制形式,并使用TCP进行传输 插座 这方面的最佳做法是什么?什么是陷阱 理想情况下,我希望该接口进行版本控制,以便发送方和接收方可以独立升级 我正在考虑JSON方法,因为我已经有了将对象序列化/反序列化为JSON的代码。如果两端都是用Java编写的,只需使用Java自己的序列化即可 另一方面,使用JSON、XML或YAM

我试图将特定类的对象从一台服务器传输到另一台服务器

我考虑的选项有:

  • 将数据序列化为JSON并发送 它使用HTTP通过网络传输,并且 在另一端反序列化
  • 将数据序列化为某种二进制形式,并使用TCP进行传输 插座
这方面的最佳做法是什么?什么是陷阱

理想情况下,我希望该接口进行版本控制,以便发送方和接收方可以独立升级


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

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


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

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

因此,如果要传输由多个子对象构成的复杂对象,则不必拆分它,只需发送该对象,它就已经包含了已包含的所有内容

编辑

关于RMI:我将它与序列化一起使用,它就像一个符咒一样工作!我曾经开发过远程swing(通过TCP发送JPanel)

  • RMI可以帮助您调用远程方法并从主服务器获取对象
  • 客户端可以使用序列化(通过不同的套接字)发回对象或将它们作为参数传递给RMI调用,这应该是个人的首选

  • 当然,我不知道您到底想做什么,但这两个工具都很好用,而且还可以正交使用。

    为什么使用JSON?这通常用于web应用程序

    创建一个能够返回所需Java对象的web服务更有意义。这样您就不必担心序列化/反序列化了。

    一些选项:

    • 如果您需要通过公共网络执行此操作,请使用json http方法,因为您不会遇到防火墙问题-您可以通过端口80执行此操作
    • 如果您在intranet上执行此操作的最快方法(从安装和维护的角度来看)可能是老式的,它只需要您定义远程接口并连接到rmi服务器,那么您可以在几分钟内启动并运行,并对远程对象/服务进行持续更改,而无需太多麻烦。在幕后,这只是使用java序列化
    • 如果您的需求对性能敏感(低延迟、高吞吐量),您可以使用
    • 还可以查看自定义序列化的接口

    您的选择分为仅数据解决方案和数据+行为解决方案


    对于数据,您可以使用JSON,也可以使用Java的序列化JSON很简单,但您必须使用自己的类包装器。使用Java的序列化可以很好地工作,因为编组问题是众所周知的,并且以一致的方式处理。这种方法的一种变体是在本地和远程系统上都提供Java类,但是如果您这样做,那么您最好继续执行RMIRMI很好,因为您不必为远程端编写单独的类,但在分发对象时必须注意一些问题,例如确保设置类的序列ID或必须将确切的二进制类文件分发到远程系统。您可以使用RPC来实现这一点,但如果您要做到这一点,您最好创建一个web服务并使用SOAP,多年来,我尝试了很多选项或序列化/反序列化,包括JSON、XML、SOAP、protobuf和其他一些我在这里不好意思命名的选项:-)

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

    最近我们的情况很好。还具有良好的(反)序列化包

    版本控制:JSON没有内置的版本控制支持(可能有),所以您必须运行自己的版本控制。保持主/次版本编号方案通常是个好主意:主版本编号不兼容,次版本向后兼容,这样客户端1.2可以与服务器1.5通信,但不能与服务器2.1通信

    格查斯:
    • 有时转换Java泛型很有挑战性,比如TreeMap
    • 默认情况下,某些实现可能嵌入实现类名,这使得协议不太容易抗更改。你可能不想在电线上做任何多余的东西。

    我建议使用带有JSON编码的Avro;您将在仍然使用HTTP和JSON的情况下获得所需的版本控制支持,并且不必自己编写序列化/反序列化代码。有关Avro功能的简要说明,请参阅,如果您在开始使用时遇到任何问题,请在邮件列表中留言或加入Freenode上的#Avro频道。

    我知道此帖子现在已经过时了,但我只是偶然发现了它,我想为了未来读者的利益,我会投入2美分

    除非出于某种原因需要JSON,否则实际上不需要两个应用程序使用它进行通信。我同意上述Avro建议。Avro允许您编写业务逻辑代码,并处理序列化/反序列化