通过网络传输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)
当然,我不知道您到底想做什么,但这两个工具都很好用,而且还可以正交使用。为什么使用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
- 默认情况下,某些实现可能嵌入实现类名,这使得协议不太容易抗更改。你可能不想在电线上做任何多余的东西。