我想创建一个类,例如,延伸的HttpServlet? 我的编译器警告我说,我的课应该有一个的serialVersionUID。 如果我知道这个对象将永远不会被序列化,我应该把它定义或添加注释,以抑制这些警告?
你会怎么做?为什么?
我想创建一个类,例如,延伸的HttpServlet? 我的编译器警告我说,我的课应该有一个的serialVersionUID。 如果我知道这个对象将永远不会被序列化,我应该把它定义或添加注释,以抑制这些警告?
你会怎么做?为什么?
我不知道Java的最佳实践,但它发生,我认为,如果你声称该序列永远不会发生,你可以添加它抛出一个writeObject方法。 然后取消警告,因为它不可能适用于您的安全知识。
否则,有人可能在将来通过父类的序列化的对象,并使用其中一个默认序列化形式结束了:
添加一个ID听起来像一个bodge,因为你真正想要做的是不序列。 期待呼叫者不序列化你的对象是指你希望他们“知道”时,他们的HttpServlet类的。 这违反多态性是在你的头上了具有一定不能被序列化一个序列化对象,你至少可以做的是确保粗心呼叫者知道。
如果你不打算序列化的情况下,添加一个SuppressWarning。
所产生的串行ID可以是有点危险。 这表明,你故意给它一个序列号,它是保存序列化和反序列化。 人们很容易忘记您的类别改变更新您的应用程序的更新版本的序列号。 如果类字段已被更改的反序列化将失败。 有一个SuppressWarning至少告诉你的代码,你不打算序列化这个类的读者。
我拒绝通过Eclipse中被恐吓到的牵绊我的代码!
我只是配置Eclipse不生成失踪的serialVersionUID警告。
感谢@史蒂夫·杰索普,他对这个答案。 这是5行代码......几乎没有一件麻烦事。
我添加@SuppressWarnings("serial")
只是问题的类以上。
我还添加了这种方法:
private void writeObject(ObjectOutputStream oos) throws IOException {
throw new IOException("This class is NOT serializable.");
}
希望这就是史蒂夫的意思:)
即使你知道这个对象将被序列化,没有必要产生的serialVersionUID因为Java将自动生成它为你,并会自动保持变化的轨迹被您的序列会一直工作得很好。 你应该产生它只有当你知道你在做什么(向后连续兼容,手动更改跟踪等)
所以,我要说抑制警告是在大多数情况下的最佳和最安全的解决方案。
这一警告我逼疯了,因为每次你继承一个Swing类,你知道你永远不会序列化,但愚蠢的警告。 但是,是的,我让Eclipse中生成一个。
这是好事,产生SVUID来实现序列化的每个类。 原因很简单。 你永远不知道什么时候会由您或一些第三方序列化。 有可配置大量的服务,这将系列化的servlet。 对于每一个IDE存在插件,它产生一个或只是使用模板和设置svuid = 1L。
让Eclipse中生成的ID。 快捷方便。 警告是不可忽视的。 同时为您节省许多麻烦你曾经来到这里对象/有/要序列化的点。
如果你离开了的serialVersionUID java会产生一个编译时(它与每一个编辑的变化)的类。
反序列化当反序列化对象的的serialVersionUID进行比较的是,在JVM之类的对象。 如果它们是不同的,他们被认为是不相容的,一个异常被抛出。 这可以提升你的计划和反序列化老班后发生的实例。
我总是用1L的的serialVersionUID。 它不会伤害(相对于默认生成的),它仍然留下递增的ID后破坏兼容性的选项。
请点击此链接以获得详细的解释: http://technologiquepanorama.wordpress.com/2009/02/13/what-is-use-of-serialversiouid/
这取决于。
如果使用不同的编译器来编译源代码多次,你的编译代码可以有不同的serializationIds将打破序列化。 然后,你需要坚持恒定serializationId明确在你的代码。 它必须是静态的,最终的,每类(不可继承)。
但是,如果你总是与特定的编译器编译代码,并始终在一个镜头切换到所有虚拟机的部署你的代码,你可能需要严格的版本检查,并希望确保任何时候只有一个版本,你的代码运行,在这种情况下,你应该只抑制警告。 因此,在情况下,虚拟机无法成功部署和运行旧版本的代码,你可能序列化过程中期待一个例外,而不是怪癖反序列化对象。 这恰好是我的情况,我们曾经有过一个非常非常大的集群,我们需要严格的版本检查,找出任何部署问题。
无论如何,也许你应该避免序列化只要有可能,因为默认的序列是非常缓慢相比,协议缓冲区或节俭,不支持跨语言的互操作性。
如果你知道你的应用程序从未序列化的东西,抑制警告应用范围。 这可以使用javac命令行参数来完成:
javac -Xlint -Xlint:-serial *******
这样,您将有不同的“串行”的所有警告。 IDE-S和构建工具,如Maven的/ SBT /摇篮正常工作这一点。