我想将一个对象及其临时属性写入流(或字节数组)中,以便能够在另一个VM中重建它。 我不想修改其属性,因为该对象是旧版应用程序的一部分。
标准Java序列化机制无济于事。 我还有什么其他选择?
更新:
我问这个问题的原因是我想修改现有的Spring应用程序。 它较早地在过程中调用了bean的方法,但是现在我想将bean移到单独的机器上,并通过HTTP调用程序使用Spring远程处理。 而且我有一个参数,该参数具有需要传递给此方法但无需在应用程序的其他部分中序列化的瞬态字段。
嗯-如果某个属性被标记为transient,则完全意味着它并不意味着被视为对象持久状态的一部分,例如用于序列化。您根本想执行此操作的事实是代码异味,而正确的解决方案是阻止这些字段是瞬态的。
假设无论出于何种原因,您都无法修改目标类本身。我的第一个想法是,您可以通过实现readObject()和writeObject()方法来自定义序列化,但是这也需要更改目标类。
在这种情况下,您需要使用某种基于反射或基于元数据的API来执行此操作。有很多库可以将对象与XML或JSON或DB行之间来回转换。您最好的选择是使用其中一种在"水合"形式与对象之间进行转换(可能需要自定义)它们,因为任何理智的序列化程序都会忽略瞬态字段)。选择哪一个取决于您当前的软件堆栈以及您的确切要求。
我认为您无法更改旧代码。在这种情况下,我认为您将不得不借助反射和DataOutputStream遍历对象字段。
transient变量应该是无法序列化或易于重新计算的变量。
我的第一个建议是在此对象上寻找重新计算transient字段的方法。