Java:在readObject / writeObject方法中传递参数

3
我重写了readObject/writeObject方法以自定义对象的序列化。问题是这些方法不接受任何参数。有没有办法在这些方法中传递参数,以便我可以在序列化过程中使用它们?
提前感谢您。

1
这些参数将如何被传递呢?在调用 objectOutputStream.writeObject(foo) 时,无法给出任何参数。这个问题并没有太多意义。 - JB Nizet
这些方法用于序列化对象的状态,该状态应对它们可访问。为什么你想要传递参数?如果需要某些信息来自定义序列化,则应该将其作为对象状态的一部分。 - ejb_guy
你期望的是哪种参数?对象的序列化只需要这个对象。如果你想要自定义序列化,你需要以不同的方式实现它。 - Marc
问题在于这些方法确实需要参数:流对象。你的实际问题是什么? - user207421
我有类似的需求。需要这样做的原因是初始化瞬态字段,这些字段依赖于对象恢复时的当前环境状态,并且不是对象的永久属性。正如Pablo所建议的那样,解决方案是正确的:子类化ObjectInputStream并在子类中传递参数。然后,对象类的readObject方法可以访问这些参数并初始化瞬态字段。 - Dale
2个回答

0

没有选项可以传递参数,而且你为什么需要这样做呢。

序列化和反序列化是写入和读取对象状态的过程,因此在序列化或反序列化之前,您的类应该具有其中的所有属性。

这两种方法不应该有任何传递参数的原因。


我同意在大多数情况下这没有意义,但让我解释一下我的情况。我有一个包含字段的Record类。每个字段根据Record的属性编写/读取其有效负载。您建议针对此问题采用不同的解决方法吗? - Alex
如果字段依赖于编码,则编码应成为字段的一部分,这样可以彻底解决此问题。 - mprabhat
如果该编码对记录的每个字段都相同,那么在每个字段上添加编码属性将是冗余的。我想要一个可以有效处理这些情况的解决方法。 - Alex
由于字段取决于记录编码,因此字段应该具有编码属性,或者字段应该具有编码的引用,这样可以更好地实现面向对象编程。 - mprabhat
实际上,Field 对 Record 有一个引用,但我认为这会混淆事情,所以我决定将其切断。更一般的情况是,我想要一个对调用者的引用(因为我编写 Record 对象,并且 Record 对象对 Field 有引用,我想知道哪个 Record 实际触发了 Field 对象的写操作)。 - Alex

0

您不能更改读/写方法的签名。解决此问题的一种方法是在对象中设置和存储序列化参数,并在读/写方法中使用它们。

或者,您可以创建一个静态类,例如SerializationParameter,并将序列化参数存储在其中。由于它们是静态的,因此您不必为每个序列化对象在内存中复制它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接