为什么 JAX-RS 会忽略 transient 关键字

Why does JAX-RS ignore the transient keyword

在以下对象中:

class Foo implements Serializable {
    transient String bar;
    String baz;
}

JAX-RS 将忽略 transient 关键字并在响应中仍然序列化 bar。在这种情况下要停止序列化,您需要使用注释(即 @XmlTransient)。这个要求背后的原因是什么?从表面上看。看来只要关键字就够了。

在什么情况下关键字可能是 insufficient/improper 并且需要注释?

这只是框架设计者做出的决定。它以增加一点复杂性为代价为实施者提供了更大的灵活性,尽管他们的决定可能有其他原因。

序列化的灵活性,这是 transient 的最初目的,可以跳过字段,但字段仍然可以由 JAX-RS 填充,反之亦然。此外,它清楚地分离了关注点。

注释很棒,因为它们是命名空间的,允许多个 API 注释相同的字段而不会踩到彼此的脚趾:

  • @XmlTransient 使其成为 JAX-RS 的瞬态。
  • @JsonIgnore 让它对杰克逊来说是短暂的。
  • @Expose 使其在 GSON 中成为非瞬态的。
  • 您可以使用 none,任何或全部。

不幸的是,2004 年 Java 1.5 首次支持注释,而 1997 年 Java 1.1 添加了序列化。

由于他们没有用户可声明的注释,因此他们添加了 transient 关键字。如果它是今天发布的,它无疑会使用自己的序列化 API 特定注释来代替。

JAX-RS 选择将 transient 视为另一个 API 特定注释。这是一个很好的调用,因为添加另一个 API 的注释很容易,但如果多个 API 试图解释彼此的注释,它会变得复杂且容易出错。