The serializable class MyException
does not declare a static final serialVersionUID field of
type long
错误提示是上面这句。
结果我在类里加了一句:private static final long serialVersionUID = 1L;
就好了!
刚才翻了下百度,发现原来是:
If a serializable class does not explicitly declare a serialVersionUID, then the
serialization runtime will calculate a default serialVersionUID value for that class based
on various aspects of the class, as described in the Java™ Object Serialization
Specification. However, it is strongly recommended that all serializable classes explicitly
declare serialVersionUID values, since the default serialVersionUID computation is highly
sensitive to class details that may vary depending on compiler implementations, and can
thus result in unexpected InvalidClassExceptions during deserialization. Therefore, to
guarantee a consistent serialVersionUID value across different java compiler
implementations, a serializable class must declare an explicit serialVersionUID value. It
is also strongly advised that explicit serialVersionUID declarations use the private
modifier where possible, since such declarations apply only to the immediately declaring
class–serialVersionUID fields are not useful as inherited members.
以上是Serializable在javadoc中的描述。
也既是说:
serialVersionUID用来作为Java对象序列化中的版本标示之用;
如果一个序列化类没有声明这样一个static final的产量,JVM会根据各种参数为这个类计算一个;
对于同样一个类,不同版本的JDK可能会得出不同的serivalVersionUID;
好像可以通过一些设置把这个警告不提示。
其实不用插件也可以生成。新加一个implements Serializable的类,编辑器左边会有一个警告标记(灯
泡加叹号),双击它,会有一个菜单弹出,可以选择生成默认的serialVersionUID(1L),还是随机的
。
也就是选中那个add default serialVersionUID的那个选择就行了.
关于myeclips提示The serializable class XXX does not declare a static final serialVersionUID field of type long的警告
我们在用eclips/myeclips的时候,会出现这个warning,比如在用hibernate时,自动生成表的对应类后,就有这个提示。这是为什么呢?
这与jdk的版本没关系
那是Eclipse提供这个提示功能给你吧.
你点它warning的icon两下Eclipse就会自动给定.
如果你不喜欢,可以把它关掉,
windows -> preferences -> compiler -> Error/Warnings
-> Potential Programming problems
将Serializable class without serialVersionUID的warning改成ignore.
其实如果你没有考虑到兼容性问题时,那就把它关掉吧.
其实有这个功能是好的.
只要任何类别实作了Serializable这个介面,
如果没有加入serialVersionUID,Eclipse都会给你warning提示,
这个serialVersionUID为了让该类别Serializable後兼容.
考虑一下,如果今天你的类Serialized存到硬碟里,
可是後来你却更改了类别的field(增加或减少或改名).
当你Deserialize时,就会出现Exception.这样就会做成不兼容性的问题.
但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize.
这个可以避开不兼容性的问题.