Java 我应该用Serializable标记spring mvc DTO吗?

Java 我应该用Serializable标记spring mvc DTO吗?,java,json,spring-mvc,dto,serializable,Java,Json,Spring Mvc,Dto,Serializable,我们开发了非常常见的spring MVC应用程序 我们有: 控制器层(@RestComtroller+@GetMapping和@PostMapping) 服务层(@Service) 存储库层(crudepository来自spring数据jpa) 我们使用DTO在FE和BE之间进行通信 今天,我的同事让我将所有DTO标记为implements Serializable,并添加serialVersionUID字段。我问他原因,但他说这是一种“最佳做法”。我真的很困惑可序列化与java序列化相关,但

我们开发了非常常见的spring MVC应用程序
我们有:
控制器层
@RestComtroller
+
@GetMapping
@PostMapping

服务层
@Service

存储库层
crudepository
来自
spring数据jpa

我们使用DTO在FE和BE之间进行通信

今天,我的同事让我将所有DTO标记为
implements Serializable
,并添加
serialVersionUID
字段。我问他原因,但他说这是一种“最佳做法”。我真的很困惑<代码>可序列化与java序列化相关,但我们使用JSON进行BE和FE通信

你能澄清这个问题吗?那么我应该用Serializable标记spring mvc DTO吗?

不,不应该

序列化意味着一方将对象的状态保存为字节序列,而另一方在将来某个时间将这些字节重建为活动对象

这意味着您应该在后端使用Java序列化API,通过网络传递结果,并找到一种方法,让接收到的字节在前端发挥作用。序列化Java对象的格式是特定于Java的,并不是设计为不可知的,因此您可能找不到合理(且简短)的方法

您不应该这样做(因为您是通过JSON与客户机通信的)

实现
java.io.Serializable
对于 通过IIOPJRMPRMI)在 JVM实例。对于纯web应用程序,域对象 有时存储在
HTTPSession
中,用于缓存目的。A. http会话可以序列化或群集。在这两种情况下,所有的 内容必须可序列化

在大多数情况下,没有理由使DTO可序列化,但我想通过添加以下想法来扩展我的答案:在更实用的体系结构中,域对象也可以直接暴露于表示层。因此,您可以将分离的JPA实体作为值持有者传递给web应用程序,而不是将数据从域对象复制到DTO(这违反了DRY Principal)。在这种情况下,最好实现java.io.Serializable


更具体地说,当你想决定你是否需要执行<代码>可序列化< /> >:

什么是FE并在这里?在控制器和服务之间?这些DTO是否真的在任何时候被序列化,或者它们只是在运行的应用程序中传递?@NathanHughes我认为这是前端(FE)和后端(BE)。@Vinit:是的,但这是不明确的。同样令人困惑的是,“我们如何使用DTO进行FE和BE之间的通信”,后来它说“但我们使用JSON进行BE和FE之间的通信”。请澄清在您定义的图层中使用哪一个。@Nathan Hughes,FE前端,BE后端。我们(实际上是SpringDoIt)用json序列化DTO。那么您从控制器返回一个DTO,messageConverter会从中构建json吗?对,在这种情况下,使DTO可序列化没有意义。仅当需要通过网络存储或传输时,才使其可序列化。