我想创建一个类,例如,扩展HttpServlet?我的编译器警告我,我的类应该有一个serialVersionUID.如果我知道这个对象永远不会被序列化,我应该定义它还是添加注释来抑制这些警告?
你会做什么以及为什么?
我不了解Java最佳实践,但我发现如果你声称序列化永远不会发生,你可以添加一个抛出的writeObject方法.然后压制警告,安全地知道它不可能适用于你.
否则有人可能会在将来通过父类序列化您的对象,并最终得到一个默认的序列化形式,其中:
表单在不同版本的代码之间不兼容.
你已经压制了这种情况的警告.
添加ID听起来像是一个bodge,因为你真正想做的不是序列化.期望调用者不要序列化你的对象意味着你希望他们在他们的HttpServlet属于你的类时"知道".对于拥有一个不能序列化的Serializable对象而言,多态性的破坏就在您的头上,而您至少可以做的是确保不知情的调用者知道它.
如果您不打算序列化实例,请添加SuppressWarning.
生成的序列ID可能有点危险.它表明你故意给它一个序列号,并保存为序列化和反序列化.很容易忘记在更新类的应用程序的更新版本中更新序列号.如果类字段已更改,则反序列化将失败.让SuppressWarning至少告诉读者你的代码,你不打算序列化这个类.
我拒绝被Eclipse恐吓为我的代码添加杂乱!
我只是将Eclipse配置为在缺少serialVersionUID时不生成警告.
谢谢@ Steve Jessop对此的回答.这是5行代码......几乎没有麻烦.
我@SuppressWarnings("serial")
刚刚在课堂上方添加了问题.
我还添加了这个方法:
private void writeObject(ObjectOutputStream oos) throws IOException { throw new IOException("This class is NOT serializable."); }
希望这就是史蒂夫的意思:)
即使您知道该对象将被序列化,也不需要生成serialVersionUID,因为java会自动为您生成它并自动跟踪更改,因此您的序列化将始终正常工作.只有在知道自己在做什么时才应生成它(向后序列化兼容性,手动更改跟踪等)
所以我想说在大多数情况下,抑制警告是最好和最安全的解决方案.