Java 序列化 vs JSON vs XML

Posted

技术标签:

【中文标题】Java 序列化 vs JSON vs XML【英文标题】:Java Serialization vs JSON vs XML 【发布时间】:2012-06-21 14:11:37 【问题描述】:

我想知道在处理通过网络传输对象时我们应该选择哪种序列化机制。有什么好处和坏处?

我知道大多数时候我们使用JSONXML 来表示AJAX,因为传输格式几乎是javascript 格式,而且JSON 非常轻巧,占用空间小,因此是@ 987654326@序列化完全出局?

【问题讨论】:

【参考方案1】:

一般来说,重要的问题是哪个客户端将接收序列化对象 - 浏览器/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 作为通信协议,它确实简化了开发。然而,由此产生的应用程序组件将是硬耦合的,这将使其非常难以替换。

还有一点需要注意 - 序列化通常有其开销。然而,当通过网络进行通信时,瓶颈通常是网络而不是序列化/反序列化本身。

【讨论】:

那么当它是 JAVA-to-JAVA 通信时,你还会考虑 JSON 或 XML over java 序列化吗? 如果您传递的只是数据,我会选择 XML 或 JSON。我不会手动序列化和传输 Java 对象。如果在两端具有相同的对象定义有意义,并且如果您对调用远程对象上的方法感兴趣,请查看 Java RMI。希望对您有所帮助。【参考方案2】:

我认为这取决于。如果您要发送 http 请求或其他内容,那么 JSON 或 XML 显然是一个不错的选择。如果您只是通过 tcp 套接字为某些分布式算法发送 java 对象,或者我认为 java 序列化更容易/更好

【讨论】:

【参考方案3】:

虽然通过网络进行序列化,但 XML 和 JSON 都可以工作。这取决于这些信息的消费者。

1234563事实上,许多 Ajax 库(例如 jQuery)对 JSON 有很好的支持。

如果您的使用者是另一个应用程序,它可能在也可能不在 java 中,那么 XML 是首选的序列化机制。 Web 服务大量使用 XML。

如果您的使用者是另一个 Java 程序,那么 Java 序列化绝对是首选选项(例如 RMI)。所以它还没有出来:-)。

但是是的,XML 和 JSON 之间的界限很模糊。我在这里提到的是一般做法。这是一个nice article,将所有方面都放在 XML 与 JSON 上。

【讨论】:

【参考方案4】:

我曾经参加过安全工程师培训,由于 Java 原生反序列化方面存在一些安全漏洞,它可以接受任何(可能注入的恶意)字节流,因此不建议使用 Java 原生序列化。当定义/模式定义不正确时,XML 还存在一个已知的安全问题,称为 XXE(XML 内部实体)。可能会对消费端造成“十亿笑”攻击。

【讨论】:

【参考方案5】:

我认为作为开发人员,我们不需要处理响应对象的序列化。但是如果我们考虑 JSON ,它比 XML 有不错的选择。

    JSON 响应不像 XML 那样需要编码响应。 与 XML 相比,JSON 的处理和处理速度更快,因为它没有被解析。 始终对 AJAX 的 XML 响应进行编码,因此处理需要时间。 JSON 最适合用于 UI 相关编码的 Jquery,而且速度更快。 处理海量数据 例如:从服务器获取索引数据/从服务器获取索引数据,JSON 处理速度更快。

【讨论】:

以上是关于Java 序列化 vs JSON vs XML的主要内容,如果未能解决你的问题,请参考以下文章

C#关于序列化和反序列化

Java Serialization vs JSON vs XML

DotNet的JSON序列化与反序列化

DotNet的JSON序列化与反序列化

VS中生成时“sgen.exe”已退出,代码为 1解决办法

无法使用 c# xmlserializer 反序列化以前序列化的 XML