【问题标题】:Data Exchange Formats and Java Seralization数据交换格式和 Java 序列化
【发布时间】:2025-11-28 22:45:01
【问题描述】:

thread 中发布的一些非常有用的答案帮助解决了我关于序列化的问题。从回复中我了解到,这只是在 jvm 中持久化和重新创建数据的一种方式。因此,序列化用于从字节流重新创建 java 对象。然而,数据可以通过 XML/JSON 或任何其他数据格式传输。那么这可以称为序列化吗?我假设不同之处在于相关的java库将根据传递的数据格式使用字节流/xml数据/json数据等重新创建对象。在 2 个基于 java 的系统之间进行通信的情况下,我认为 bytestream 将很有用,而在使用不同技术工作的 2 个系统之间进行通信的情况下,将使用其他标准数据格式。在 EJB / Java RMI 的情况下,我假设在客户端和服务器之间传输的对象必须被序列化,因为我假设 java 将使用标准序列化 API 来反序列化对象。上面列出的这些都正确吗?

【问题讨论】:

    标签: java web-services serialization ejb rmi


    【解决方案1】:

    Wiki 总结得很好,

    In computer science, in the context of data storage and transmission, 
    serialization is the process of translating data structures or 
    object state into a format that can be stored
    

    所以你的第一个问题

    但是,数据可以通过 XML/JSON 或任何其他数据格式传输。那么这可以称为序列化吗?

    绝对是的。任何你喜欢的格式,只要它能够被存储。

    问题二:

    在 2 个基于 java 的系统之间进行通信的情况下,我认为 bytestream 将很有用,因为在使用不同技术的 2 个系统之间进行通信的情况下,将使用其他标准数据格式。

    实际上,Java 的内置序列化往往只在用户基本上不可见且速度无关紧要时才使用。例如,一些分布式产品可能使用 java 序列化将对象从一个节点发送到另一个节点。对于任何类型的 Web 服务,即使是从 JVM 支持的服务到另一个服务,JSON 或 XML 之类的某种友好格式也更为常见。对于速度很重要或负载大小必须尽可能小的任何产品,它们不会使用 java 的序列化,但可能会使用一些优先级二进制格式。

    protobufavrothrift 等协议旨在为您提供两全其美的体验。它们有些流行,但远非普遍。

    您可能还会听到编组这个词,例如编组器或编组对象。它们的意思基本相同,尽管在 Java 领域中,当您谈论非二进制格式时更常见的是编组,而当您谈论二进制格式时更常见的是序列化。

    【讨论】:

    • 谢谢蒙杰克!那么在 EJB 或 Java RMI 的情况下,是否应该始终序列化对象?这些框架是否依赖于使用 ObjectOutputStream 的 java 内部序列化功能?
    • 我对 EJB 或 Java RMI 不太了解,但我想他们使用 Java 的内部序列化或类似的东西。