将具有瞬态属性的对象写入流(Java)

时间:2010-06-30 15:13:00

标签: java spring serialization remoting transient

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

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

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

3 个答案:

答案 0 :(得分:3)

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

我们可以说,无论出于何种原因,您无法自行修改目标类。我首先想到的是,您可以通过实现readObject()writeObject()方法来自定义序列化,但这也需要更改目标类。

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

我的第一个建议是在此对象上查找方法以重新计算transient字段。