我有一个扩展Exception的类,因此必须是Serializable。异常类包含一个不可序列化的字段,因此我考虑将其设置为Transient。我的理解是这样做,意味着如果存储了我的类,则无法恢复该字段。在执行期间,我的异常会被序列化/反序列化吗? (n.b.据我所知,我不会将这些内容写入数据库或文件)。
答案 0 :(得分:7)
如果你没有自己明确地将它们序列化,那么我认为可以安全地假设你的场瞬态不会产生不良影响。
根据我的理解,JVM没有明确要求对序列化对象,因此,除非期望您的应用程序序列化Exception类,否则我认为您不必担心。
我想如果你正在编写一个库,因此无法知道你班级的所有用例,你可能需要更加小心。
答案 1 :(得分:4)
如果通过RMI,RPC框架或类似方法传播异常,则可能会导致问题。如果您不使用这些功能,那么您可以将其设置为瞬态。
答案 2 :(得分:2)
您的理解是正确的。标记为transient
的字段不被视为对象状态的一部分,并且在对象序列化时故意遗漏,并且在再次反序列化对象时将无法恢复。当您想要将对象及其状态存储在磁盘上或通过网络发送对象时,就会发生序列化。据我所知,在正常程序执行期间不会发生序列化,除非你明确地告诉程序这样做。
答案 3 :(得分:1)
您可以定义writeObject以抛出UnsupportedOperationException或NotSerializableException,以确保此对象永远不会被序列化。
答案 4 :(得分:0)
是的,如果您的异常中有瞬态字段,则如果您的对象被序列化/反序列化,则无法恢复瞬态字段。
但是,在小型应用程序中,如果您不自行序列化异常,则不太可能需要序列化/反序列化。但是,如果您使用任何“魔术”框架或JNDI或任何群集环境,请注意。