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

时间:2018-05-16 21:14:25

标签: java jax-rs transient

在以下对象中:

stash@{n}

JAX-RS将忽略transient关键字并仍然在响应中序列化class Foo implements Serializable { transient String bar; String baz; } 。要在这种情况下阻止它被序列化,您需要使用注释(即bar)。这个要求背后的原因是什么?从表面上看。似乎关键字应该足够了。

在什么用例中,关键字可能不够/不合适并且需要注释?

2 个答案:

答案 0 :(得分:4)

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

  • @XmlTransient使其成为JAX-RS的瞬态。
  • @JsonIgnore让杰克逊不知所措。
  • @Expose在GSON中使其成为非瞬态的。
  • 您可以使用none,any或all。

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

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

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

答案 1 :(得分:0)

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

序列化(其是瞬态的最初目的)可以跳过该字段的灵活性,但该字段仍然可以由JAX-RS填充,反之亦然。此外,它明确区分了这些问题。