我应该用Serializable标记spring mvc DTO吗? [复制]
Posted
技术标签:
【中文标题】我应该用Serializable标记spring mvc DTO吗? [复制]【英文标题】:Should I mark spring mvc DTO with Serializable? [duplicate] 【发布时间】:2019-02-11 01:03:19 【问题描述】:我们开发非常常用的 Spring MVC 应用程序
我们有:控制器层(@RestComtroller
+ @GetMapping
和 @PostMapping
)服务层(@Service
)Repository 层(CrudRepository
from spring-data-jpa
)
我们使用 DTO 在 FE 和 BE 之间进行通信。
今天我的同事让我将所有 DTO 标记为 implements Serializable
并添加 serialVersionUID
字段。我问了原因,但他说这是“最佳实践”。我真的很困惑。 Serializable
与 java 序列化相关,但我们使用 JSON 进行 BE 和 FE 通信。
你能澄清一下这个问题吗?那么我应该用 Serializable 标记 spring mvc DTO 吗?
【问题讨论】:
这里的 FE 和 BE 到底是什么?控制器和服务之间?这些 DTO 是否真的在任何时候都被序列化了,或者它们只是在正在运行的应用程序中传递? @NathanHughes 我假设是前端 (FE) 和后端 (BE)。 @Vinit:是的,但它是模棱两可的。同样令人困惑的是“我们如何使用 DTO 进行 FE 和 BE 之间的通信”,然后它说“但我们使用 JSON 进行 BE 和 FE 通信”。请根据您定义的层说明在哪里使用哪个。 @Nathan Hughes,FE 前端,BE - 后端。我们(实际上是 spring 这样做)在 json 中序列化 DTO。 好的,所以你从控制器返回一个 DTO,然后 messageConverter 从中构建 json?对,在这种情况下,使 DTO 可序列化毫无意义。只有在需要通过网络存储或传输时才使其可序列化。 【参考方案1】:不,你不应该。
序列化意味着一侧将对象的状态保存到字节序列中,而另一侧在将来某个时间将这些字节重建为活动对象。
这意味着您应该在后端使用 Java 序列化 API,通过网络传递结果,并找到接收到的字节对前端有帮助的方法。序列化 Java 对象的格式是特定于 Java 的,并非设计为不可知论的,因此您可能找不到合理(且简短)的方法。
而且您不应该(因为您是通过 JSON 与客户端通信)。
【讨论】:
【参考方案2】:
java.io.Serializable
的实现只需要 通过 IIOP 或 JRMP (RMI) 在 JVM 实例。在纯 Web 应用程序的情况下,域对象 有时出于缓存目的存储在HTTPSession
。一种 http-session 可以序列化或集群化。在这两种情况下,所有 内容必须是可序列化的。
在大多数情况下,没有理由使 DTO 可序列化,但我想通过添加这个想法来扩展我的答案,即在更实用的架构中,域对象也可以直接公开到表示层。因此,与其将数据从域对象复制到违反 DRY Principal 的 DTO 中,不如将分离的 JPA 实体作为值持有者传递给 Web 应用程序。在这种情况下,最好实现 java.io.Serializable。
为了更具体地了解您的问题,您在决定是否需要实施Serializable
时应考虑以下两个事实:
【讨论】:
以上是关于我应该用Serializable标记spring mvc DTO吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
序列化继承:如果基类没有标记[Serializable]会抛出异常吗?