Java 我应该用Serializable标记spring mvc DTO吗?
我们开发了非常常见的spring MVC应用程序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序列化相关,但
我们有:
控制器层(
@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
对于
通过IIOP或JRMP(RMI)在
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可序列化没有意义。仅当需要通过网络存储或传输时,才使其可序列化。