我想知道在处理通过网络传输对象时我们应该选择什么序列化机制。有什么优点和缺点?
我知道大部分时间我们都会JSON
或XML
使用AJAX
,因为传输格式几乎是Javascript
格式,加JSON
是相当轻巧,占用空间小,因此Java
序列化完全不在表格之内?
答案 0 :(得分:19)
一般来说,重要的问题是哪个客户端将接收序列化对象 - 浏览器/ JavaScript引擎,如(node-js),Java客户端,未知/多个客户端。
JSON - JSON语法基本上是JavaScript,因此任何带有JS引擎的组件都能很好地处理它的解析 - 即使是复杂的数据结构也会有效地转换为“活”对象。 JSON解析器几乎适用于任何语言,即使不使用JS引擎也很容易使用(例如,以Google Gson为例,它可以轻松地将JSON转换为相应的对象),这使得它成为跨语言交流的理想选择。 - 例如在messaging architecture。
中XML - 分享JSON的许多好处 - 跨语言,轻量级等。例如,Adobe Flex处理XML非常好,甚至比JSON更好。它绝对是JSON的合适替代品。我个人更喜欢JSON的JS语法,但XML也很好。
Java序列化 - 应该只考虑Java到Java的通信。一个重要的注意事项是类定义应该在发送端和接收端,并且通常通过传递整个对象不会获得太多。我不排除RMI作为通信协议,它确实简化了开发。然而,由此产生的应用程序组件将是硬连接的,这将使其更换非常困难。
还有一个注意事项 - 序列化通常有其开销。但是,当通过网络进行通信时,瓶颈通常是网络而不是序列化/反序列化本身。
答案 1 :(得分:6)
我认为这取决于。如果您正在发送http请求或其他内容,那么JSON或XML显然是一个不错的选择。如果您只是通过tcp套接字发送一个java对象用于某些分布式算法或其他东西,我认为java序列化更容易/更好
答案 2 :(得分:4)
虽然通过网络进行序列化,但xml和json都能正常工作。这取决于消费者的这些信息。
如果消费者是使用Ajax请求某些信息并在屏幕上呈现内容的浏览器,通常jason是最好的选择,因为它已经是Javascript对象格式,并且没有转换为Javascript兼容对象的开销。事实上,许多Ajax库(例如jQuery)都对json有很好的支持。
如果您是使用者是另一个可能在或不在java中的应用程序,那么xml是首选的序列化机制。 Web服务非常重要地使用xml。
如果你的消费者是另一个Java程序,那么肯定是java序列化是首选选项(例如RMI)。所以它尚未出来:-)。
但是,XML和Json之间存在模糊界限。我在这里提到的是一般做法。这是nice article将所有方面都放在xml vs jason上。
答案 3 :(得分:1)
我认为作为开发人员,我们不需要处理响应对象的序列化。但是如果我们考虑使用JSON,它就可以选择优于XML。
答案 4 :(得分:1)
我曾经参加过安全工程师培训,不建议使用Java本机序列化,因为Java本机反序列化方面存在一些安全漏洞,可以接受任何(可能注入的恶意)字节流。当未正确定义定义/模式时,XML也存在一个已知的安全问题,称为XXE(XML外部实体)。可能会在消费方造成“十亿笑”攻击。