0

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

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

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

4

3 回答 3

3

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

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

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

于 2010-06-30T15:21:59.450 回答
2

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

于 2010-06-30T15:18:55.167 回答
1

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

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

于 2010-06-30T15:18:49.417 回答