为什么 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 试图解释彼此的注释,它会变得复杂且容易出错。
在以下对象中:
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 试图解释彼此的注释,它会变得复杂且容易出错。