【问题标题】:Why does JAX-RS ignore the transient keyword为什么 JAX-RS 忽略瞬态关键字
【发布时间】:2018-10-27 01:05:06
【问题描述】:

在以下对象中:

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

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

在哪些用例中,关键字可能不充分/不正确,需要注释?

【问题讨论】:

    标签: java jax-rs transient


    【解决方案1】:

    注释非常棒,因为它们是命名空间的,允许多个 API 注释相同的字段而不会互相影响:

    • @XmlTransient 使其过渡到 JAX-RS。
    • @JsonIgnore 对杰克逊来说是短暂的。
    • @Expose 使其在 GSON 中非瞬态。
    • 您可以使用无、任何或全部。

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

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

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

    【讨论】:

    • 这是有道理的,但我想我宁愿看到一个注释来忽略关键字,而不是默认忽略关键字。毕竟,序列化现在没有理由不能作为注解来实现。在适用的每个命名空间都需要一个“瞬态”注解,在极端情况下可能会导致荒谬。
    • 也许吧,但它以一种易于理解的非常具体和可预测的方式吸吮。你的替代方案可能是它是@Transient,然后你有一个@json.IgnoreTransient,然后你有一个protobuf库,为了同样方便,它遵循json标签,所以现在它是@protobuf.IgnoreJsonIgnoreTransient,然后你有XML覆盖它使用@xml.ForceTransient,但您的应用程序在更新时仍会中断,因为数据库刚刚添加了对 xml 覆盖的支持,但您希望它使用 json 注释并且您的伏特加酒瓶不见了,但痛苦没有
    • 无论哪种方式你都可以得到:目前@protobuf 可能想要忽略 JSON 忽略瞬态,所以你有@protobuf.IgnoreJsonTransient。 (但我猜你保存了 6 个字符)。使用关键字(有价值与否)在语义上应该是短暂的(看看我在那里做了什么?)。毕竟,你想为每个命名空间提供一个注解来声明你的元素真的是一个整数吗?
    • 不,现在您添加 @foo.Transient@bar.Transient 并且没有交互,因此不必覆盖或覆盖覆盖。是的,我绝对想声明我的元素对于每个上下文都是一个整数,因为它可能适合 JavaScript 数字的 52 位整数精度,但不适合 OCaml 整数的 31 位精度部分。
    • 当您的上下文不是核心 Java 时,这将使 Java 'int' 关键字实际上毫无意义。这适得其反,关键字具有非常特定的含义。如果 JavaScript 或 OCaml 或其他任何人不喜欢它,他们应该指定如何处理他们的异常情况,而不仅仅是忽略关键字。
    【解决方案2】:

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

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

    【讨论】:

    • 这实现了哪种灵活性?
    • 你有如何使用它的参考或示例吗?我实际上是在问那些“其他原因”可能是什么,因为在我的一生中,我不明白这种“灵活性”的价值。
    • 不太相信这是真正的灵活性,但肯定是错误的来源。 Java 序列化是一个错误,transient 修饰符也是如此。 IMO 围绕它建立进一步的逻辑也是一个错误。不管我们是在讨论 XML 还是 Java 序列化,如果我愿意让逻辑与最初的意图保持一致的话。
    • 我并没有说灵活性值得,或者这就是决定的原因。你问“为什么?”我不会去评判这个决定本身......
    • 公平 :) 感谢您的想法
    猜你喜欢
    • 2014-11-11
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 2012-09-25
    • 2015-03-29
    • 1970-01-01
    相关资源
    最近更新 更多