【问题标题】:Write object with transient attributes to stream (Java)将具有瞬态属性的对象写入流(Java)
【发布时间】:2010-06-30 15:12:59
【问题描述】:

我想将一个对象写入具有瞬态属性的流(或字节数组)中,以便能够在另一个 VM 中重建它。我不想修改它的属性,因为该对象是遗留应用程序的一部分。

标准的 Java 序列化机制没有帮助。我还有哪些其他选择?

更新: 我问这个问题的原因是我想修改现有的 Spring 应用程序。它之前在进程中调用了 bean 的方法,但现在我想将 bean 移动到单独的机器上,并通过 HTTP 调用程序使用 Spring 远程处理。而且我对具有需要传递给此方法但不需要在应用程序的其他部分序列化的瞬态字段的参数有疑问。

【问题讨论】:

    标签: java spring serialization remoting transient


    【解决方案1】:

    嗯 - 如果一个属性被标记为transient,这意味着完全它并不意味着被视为对象持久状态的一部分,例如用于序列化。您想要这样做的事实是代码异味,正确的解决方案是阻止这些字段是瞬态的。

    让我们说,无论出于何种原因,您都不能自己修改目标类。我的第一个想法是您可以通过实现readObject()writeObject() 方法来自定义序列化,但这也需要更改目标类。

    在这种情况下,您需要使用某种基于反射或基于元数据的 API 才能做到这一点。有许多库可以将对象与 XML 或 JSON 或 DB 行等相互转换。最好的办法是使用其中之一来将对象转换为“水合”形式(并且可能需要自定义)它们,因为任何理智的序列化器都会忽略瞬态字段)。选择哪一个取决于您当前的软件堆栈以及您的确切要求。

    【讨论】:

      【解决方案2】:

      我假设您无法更改旧代码。在这种情况下,我认为您将不得不使用reflectionDataOutputStream 遍历对象字段。

      【讨论】:

        【解决方案3】:

        transient 变量应该是那些不可序列化或容易重新计算的变量。

        我的第一个建议是在这个对象上寻找方法来重新计算transient 字段。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-07
          • 2012-08-29
          • 1970-01-01
          • 2014-03-29
          • 2019-10-04
          • 1970-01-01
          • 2020-01-19
          • 1970-01-01
          相关资源
          最近更新 更多