4

我有一个扩展异常的类,因此必须是可序列化的。异常类包含一个不可序列化的字段,因此我正在考虑将其设为瞬态。我的理解是,这样做意味着如果我的类被存储,则该字段将无法恢复。在执行过程中,我的异常何时可能被序列化/反序列化?(据我所知,我不会将这些写入数据库或文件)。

4

5 回答 5

7

如果您自己没有明确地序列化它们,那么我认为可以安全地假设使您的字段瞬态不会产生不良影响。

据我了解,JVM 不会在没有明确要求的情况下序列化对象,因此,除非期望 Exception 类被您的应用程序序列化,否则我认为您不必担心。

我想如果您正在编写一个库,因此无法了解您的类的所有用例,您可能需要更加小心。

于 2011-05-10T07:33:31.557 回答
4

如果异常通过 RMI、RPC 框架或类似框架传播,则可能会导致问题。如果您不使用此类功能,则可以将其设置为瞬态。

于 2011-05-10T07:35:25.643 回答
2

你的理解是正确的。标记为transient的字段不被视为对象状态的一部分,并且在对象被序列化时被有意遗漏,并且在对象再次反序列化时不会被恢复。当您想要将对象及其状态存储在磁盘上或通过网络发送对象时,就会发生序列化。据我所知,在正常程序执行期间不会发生序列化,除非您明确告诉您的程序这样做..

于 2011-05-10T07:36:58.500 回答
1

您可以定义 writeObject 以抛出 UnsupportedOperationException 或 NotSerializableException 以确保该对象永远不会被序列化。

于 2011-05-10T07:39:54.163 回答
0

是的,如果您的异常中有瞬态字段,则如果您的对象被序列化/反序列化,则无法恢复瞬态字段。

但是,在小型应用程序中,如果您不自己序列化异常,则不太可能需要序列化/反序列化。但请注意,如果您使用任何“魔术”框架或 JNDI 或任何集群环境。

于 2011-05-10T07:36:07.753 回答