我应该用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服务层@ServiceRepository 层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 的实现只需要 通过 IIOPJRMP (RMI) 在 JVM 实例。在纯 Web 应用程序的情况下,域对象 有时出于缓存目的存储在HTTPSession。一种 http-session 可以序列化或集群化。在这两种情况下,所有 内容必须是可序列化的

在大多数情况下,没有理由使 DTO 可序列化,但我想通过添加这个想法来扩展我的答案,即在更实用的架构中,域对象也可以直接公开到表示层。因此,与其将数据从域对象复制到违反 DRY Principal 的 DTO 中,不如将分离的 JPA 实体作为值持有者传递给 Web 应用程序。在这种情况下,最好实现 java.io.Serializable。

为了更具体地了解您的问题,您在决定是否需要实施Serializable 时应考虑以下两个事实:

【讨论】:

以上是关于我应该用Serializable标记spring mvc DTO吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

对象存储

序列化继承:如果基类没有标记[Serializable]会抛出异常吗?

DataContractSerializer 和 Serializable 的问题

Java标记接口

csharp T标记为[Serializable]

什么是 [Serializable],我应该什么时候使用它?