2011-04-15

serialVersionUID

終於有一篇稍微看得懂的

引用自:关于serialVersionUID和序列化

跟一般的讲,因为在java中serialVersionUID是唯一控制着能否反序列化成功的标志,只要这个值不一样,就无法反序列化成功。但只要这个值相同,无论如何都将反序列化,在这个过程中,对于向上兼容性,新数据流中的多余的内容将会被忽略;对于向下兼容性而言,旧的数据流中所包含的所有内容都将会被恢复,新版本的类中没有涉及到的部分将保持默认值。利用这一特性,可以说,只要我们认为的保持serialVersionUID不变,向上兼容性是自动实现的。


当然,一但我们将新版本中的老的内容拿掉,情况就不同了,即使UID保持不变,会引发异常。正是因为这一点,我们要牢记一个类一旦实现了序列化又要保持向上下兼容性,就不可以随随便便的修改了!!!


但是我有了一个问题:
由此,我想到了Swing当中的组件都可以实现序列化和反序列化。因为它们实现了Serializable接口。可是并不是对于每一个实现了 Serializable接口的类都有serialVersionUID,比如在awt当中的几乎所有的组件都有serialVersionUID,但是在swing当中并没有。


文中有提到:
因为在java中 serialVersionUID是唯一控制着能否反序列化成功的标志,只要这个值不一样,就无法反序列化成功。但只要这个值相同,无论如何都将反序列化,在这个过程中,对于向上兼容性,新数据流中的多余的内容将会被忽略;对于向下兼容性而言,旧的数据流中所包含的所有内容都将会被恢复,新版本的类中没有涉及到的部分将保持默认值。


那么对于swing里面的东西,由于没有显示的写出serialVersionUID,那么系统会经过一些算法得出一个serialVersionUID(?我不确定这一点Tongue)如果这样的话,是否就意味着一旦swing组件一旦有所修改,就不会保持兼容性,也就不能够实现序列化读入读出(新版本对老版本)?Sad

沒有留言: