Spring MVC - 我的域类是否应该实现可序列化以进行电汇?

我正在尝试通过实现一个简单的REST API来学习Spring Boot。

我的理解是,如果我需要通过网络传输一个对象,该对象应该实现Serializable。

然而,在网络上的许多例子中,包括官方的例子,需要从服务器转移到客户端(反之亦然)的域类不会实现可序列化。

例如:https://spring.io/guides/gs/rest-service/

但在某些情况下,它们确实会:

例如:https://github.com/szerhusenBC/jwt-spring-security-demo/blob/master/src/main/java/org/zerhusen/security/JwtAuthenticationRequest.java

对于何时实现可序列化,是否有一般的经验法则?


答案 1

为了更新这一点,关于Serializable的建议已更改,目前的建议似乎是不要将Serializable用于任何事情

使用 Java 序列化 API 意味着您需要在线路的另一端使用 Java 中的某些内容来反序列化对象,因此您必须控制反序列化的代码以及序列化的代码。

这通常与 REST 应用程序无关,使用应用程序响应是其他人代码的业务,通常在组织外部。在构建REST应用程序时,通常要避免对使用它的内容施加限制,选择一种与技术无关且广泛可用的格式。

拥有对象实现的一些原因是:java.io.Serializable

  • 所以你可以把它放在一个HttpSession中

  • 因此,您可以在分布式应用程序的各个部分之间通过网络传递它

  • 因此,您可以将其保存到文件系统并在以后还原它(例如,您可以使队列的内容可序列化,并在应用程序关闭时保存队列内容,当应用程序开始将队列恢复到关闭时的状态时,从保存位置读取)。

在所有这些情况下,您都需要进行序列化,以便可以将某些内容保存到文件系统或通过网络发送。


答案 2

有许多方法可以序列化对象。Java的对象序列化只是其中之一。来自官方文档

序列化对象意味着将其状态转换为字节流

REST API 通常发送和接收 JSON 或 XML。在这种情况下,序列化对象意味着将其状态转换为 .String

“通过网络发送对象”与实现 之间没有直接联系。您使用的技术决定了是否必须实施。SerializableSerializable