【问题标题】:Why org.springframework.http.ResponseEntity doesn't implements Serializable为什么 org.springframework.http.ResponseEntity 不实现 Serializable
【发布时间】:2020-10-09 14:30:54
【问题描述】:

我尝试了解 Serializable 接口及其实用程序。

我现在知道实现 Serializable 的对象将被转换为字节流,以便它们可以通过网络传输或保存在数据库中。

我的问题是为什么 org.springframework.http.ResponseEntity 没有实现 Serializable 接口,因为 ResponseEntity 是 Spring RestController 响应?

PS:我问了这个问题,我知道我可能完全没有抓住重点,而且我还不理解 Srializable 和 ResponseEntity 的概念。

【问题讨论】:

    标签: java spring serialization


    【解决方案1】:

    java.io.Serializable 使用一种特定 类型的serialization,称为Java serialization。当它作为核心语言平台的一部分引入时,它是一项重大创新(并且仍然具有一些值得尊敬的特性,例如处理引用循环),但它有一些严重的缺点,其中最大的缺点是它与其他平台不兼容(包括人的眼球)。

    相反,现代应用程序倾向于使用其他序列化机制(主要是 JSON,还有大量 XML,以及 Avro 和 Protocol Buffers 等其他一些选项)。这些不使用内置的平台序列化功能,而是使用检查对象并输出序列化形式的库(例如 Jackson)。这意味着这样的对象不需要实现Serializable

    ResponseEntity 没有实现Serializable 的一个主要原因是这样做需要其所有内容也实现Serializable,否则NotSerializableException 可能会在运行时发生意外.既然没有什么实用价值,还是跳过吧。

    【讨论】:

      【解决方案2】:

      Java 序列化格式适用于打算稍后转换回 Java 对象的对象,并且通常仅适用于解码时和编码时具有相同类的情况。

      浏览器通常不是用 Java 编写的,也不应该知道 org.springframework.http.ResponseEntity 类的内部工作原理。它只知道 HTTP 协议。

      因此,ResponseEntity 将以 HTTP 响应格式传输,这与 Java 序列化格式非常不同。

      【讨论】:

        【解决方案3】:

        看看Java Tutorial on Serialization

        序列化对象意味着将其状态转换为字节流,以便字节流可以恢复为对象的副本。

        序列化不是关于如何通过网络发送字节流,而是关于如何将Java对象分解为字节,并将分解恢复为完全相同的Java 对象,例如:

        Object <--> Bytes <--> Object.
        

        ResponseEntity&lt;T&gt; 只不过是一个特殊格式 String 消息,它通过 HTTP 协议(​​TCP 连接)从一台机器发送到另一台机器,很可能与 Content-Type 标头一起发送。

        Receiver(让它成为浏览器)接收数据,将该数据转换回人类可理解的 representational 格式,在Content-Type 中指定,这就是结果,它不是 Java对象了。

        【讨论】:

          猜你喜欢
          • 2011-06-23
          • 2012-06-17
          • 2021-06-09
          • 2010-09-15
          • 2013-05-01
          • 2012-01-28
          • 2012-07-20
          • 2018-07-29
          • 1970-01-01
          相关资源
          最近更新 更多