使用serialVersionUID还是禁止显示警告?
我想创建一个类,例如,扩展HttpServlet?我的编译器警告我,我的类应该具有serialVersionUID。如果我知道该对象永远不会序列化,是否应该定义它或者添加注释以禁止显示这些警告?
你会怎么做,为什么?
解决方案
让Eclipse生成一个ID。快捷方便。警告不容忽视。如果我们遇到了要对对象/ has /进行序列化的问题,也可以省去很多麻烦。
如果我们不打算序列化实例,请添加一个SuppressWarning。
生成的序列ID可能会有些危险。这表明我们有意为其提供了序列号,并且可以省去序列化和反序列化的过程。忘记更改类的应用程序的较新版本中的序列号很容易忘记。如果更改了类字段,则反序列化将失败。拥有SuppressWarning至少可以告诉代码读者我们不打算序列化此类。
我不知道Java最佳实践,但是我想到如果我们声称序列化将永远不会发生,则可以添加一个抛出的writeObject方法。然后,在可能无法应用警告的情况下,安全地消除警告。
否则,将来有人可能会通过父类对对象进行序列化,并最终得到默认的序列化形式,其中:
- 表单在不同版本的代码之间不兼容。
- 我们已取消这种情况的警告。
添加一个ID听起来像是一个大杂烩,因为我们真正想要做的是不序列化。期望调用者不要序列化对象意味着我们希望他们的HttpServlet是类时"知道"。拥有一个不可以序列化的Serializable对象,对多态性的破坏就在头上,并且我们要做的至少是确保粗心的调用者知道它。
该警告使我发疯,因为每次将Swing类作为子类时,我们都知道我们永远不会序列化它,但是有一个愚蠢的警告。但是,是的,我让Eclipse生成了一个。
我拒绝被Eclipse吓倒而使代码混乱!
我只是将Eclipse配置为在缺少serialVersionUID时不生成警告。
即使我们知道该对象将被序列化,也无需生成serialVersionUID,因为java会自动为我们生成该对象并自动跟踪更改,因此序列化始终可以正常进行。仅当我们知道自己在做什么(向后序列化兼容性,手动更改跟踪等)时,才应生成它。
因此,我想说在大多数情况下,禁止警告是最好和最安全的解决方案。
如果遗漏了serialVersionUID,则java将在编译时为该类生成一个(每次编译都会更改)。
反序列化对象时,将反序列化对象的serialVersionUID与jvm中的类的serialVersionUID进行比较。如果它们不同,则认为它们不兼容,并引发Exception。例如,在升级程序并反序列化旧类之后,可能会发生这种情况。
我一直使用1L作为serialversionUID。它没有问题(与生成的默认值相比),并且仍然保留了以后通过增加id来破坏兼容性的选项。
最好为实现可序列化的每个类生成SVUID。原因很简单。我们永远都不知道何时由我们或者某个第三方将其序列化。可以配置很多服务,这些服务将序列化servlet。对于存在的每个IDE,都会生成一个插件或者仅使用模板并设置svuid = 1L。
请点击以下链接获取详细说明:http://technologiquepanorama.wordpress.com/2009/02/13/what-is-use-of-serialversiouid/
感谢@ Steve Jessop对此的回答。它只有5行代码,几乎没有麻烦。
我在相关课程的上方添加了@@ SuppressWarnings(" serial")`。
我还添加了此方法:
private void writeObject(ObjectOutputStream oos) throws IOException { throw new IOException("This class is NOT serializable."); }
希望那是史蒂夫的意思:)