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