我正在尝试将特定类的对象从一个服务器传输到另一个服务器。
我正在看的选项是:
这方面的最佳做法是什么?有什么问题?
理想情况下,我希望对接口进行版本控制,因此可以单独升级发送方和接收方。
我正在考虑使用JSON方法,因为我已经有了将对象序列化/反序列化为JSON的代码。
答案 0 :(得分:6)
每当我需要传输Java对象时,假设有类似的JVM版本,我总是使用普通的Java序列化(Sun official tutorial):它更简单,你不必关心项目或聚合的传输链,因为序列化已经关心它(如果你正确实施)。
因此,如果你想传输一个由许多子对象构成的复杂对象,你不必拆分它,发送它并重新组合它:你只需要发送对象,它已经包含了已经包含的所有内容。
修改强>
关于RMI:我将它与序列化一起使用,它就像一个魅力!我曾经开发远程摆动(通过TCP发送JPanels)..
当然我不知道你想要做什么,但这两种工具都很好用,也可以正交使用。
答案 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)
一些选项:
答案 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通信。
陷阱: