在Java中将Exception字段变为瞬态的

4

我有一个继承了Exception的类,因此必须是Serializable的。这个异常类包含一个不可序列化的字段,因此我考虑将它设为Transient。我的理解是这样做会导致如果我的类被存储,该字段无法被恢复。在程序执行期间,什么时候会对我的异常进行序列化/反序列化?(注:据我所知,我没有将它们写入数据库或文件中)。


2
如果您的应用程序被放置在 Web 服务后面,并且您正在使用的 Web 服务堆栈支持远程异常,则应用程序抛出的每个异常都可以发送到客户端并重新抛出。 - bobah
5个回答

7
如果您没有显式地对它们进行序列化,那么我认为将字段设置为瞬态的应该没有任何负面影响。
据我的理解,JVM不会在未被显式要求序列化对象时进行序列化,因此,除非您期望应用程序序列化Exception类,否则我认为您没有必要担心。
我想,如果您正在编写一个库,因此无法知道类的所有用例,您可能需要更加小心。

4
如果异常正在通过RMI、RPC框架或类似方式传播,那么可能会引起麻烦。如果您不使用这些功能,则可以将其设置为瞬态。

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

1

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


0

如果您的异常中有瞬态字段,那么当对象被序列化/反序列化时,这些瞬态字段将无法被恢复。

然而,在小型应用程序中,如果您不自己序列化异常,那么您很可能不需要进行序列化/反序列化。但是请注意,如果您使用任何“神奇”的框架、JNDI或任何集群环境,则需要格外小心。


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