实现Serializable的类里边,没有定义serialVersionUID变量,采用了默认的值,一旦修改了类,这个值就变了。所以造成序列化或反序列化失败。解决办法:明确调用serialVersionUID变量,确保它的值不变,当然类的修改不应有太大的变化。

解决方案 »

  1.   

    刚学JAVA,不明白你说的问题,可以给我具体的代码吗!?麻烦你了!
      

  2.   

    例如:public class Aclass implements Serializable {private static final long serialVersionUID = 1L; // 定义一个这样的常量......
    ......}
      

  3.   

    不好意思!:(
    还是不懂!而且我在代码里面添加那句serialVersionUID常量,还是不能运行!
    哎,那个朋友能帮我解决,我再加30分!
      

  4.   

    恩,我发贴的时候忘记重写了,不过重写了也不行!
    我在Person类里加了:
    public int hashCode(){
      return 7*name.hashCode();
    }
    不过还是一样的问题!
    郁闷呀……
      

  5.   

    楼主
    你的文件是写在C://IOExample/PhoneBook.bin
    请把你硬盘上的这个文件删掉,然后再运行程序
    就不会报错了。
      

  6.   

    To:fredonline(天天挨踢)
    郁闷了……这是为什么呢!?能给我解释一下吗!?
      

  7.   

    Sorry,睡了个午觉。才看到。
    对于这种错误,我理解的很浅,只能大概说一下。请大家补充。
    所有implements Serializable的类,都会默认有一个自己的serialVersionUID。
    serialVersionUID就像是根据你这个类的内容计算出来的一个不会重复的串,目的很明显,唯一标示某一个类的版本。
    在你开始写这个程序的时候,并不是现在这种结构,比如说可能没有区号这个域。
    这时,你运行了程序,生成的文件保存在了硬盘上,我没仔细看程序,估计bin文件内已经有一个被序列化保存的PhoneBook类,其serialVersionUID = -3463812609891807143。
    然后你修改了程序,本地PhoneBook这个类的serialVersionUID已经自动改为9038356574367163630。
    这时,你想再从bin文件中反序列化老的数据并放到新的PhoneBook实例里,就会触发这个异常。
    请看上面trumplet(检查)的解释,他说的就是对的。
    然后chenxk(射线)说让你加上private static final long serialVersionUID = 1L;
    这的目的是硬性的给这个类声明一个ID,不要它自己计算,因此,不管你修改多少个版本,至少JVM都认为是一个版本。在进行序列化和反序列化的时候,会隐藏掉一些异常,老版本的数据没准儿也能成功地进行反序列化。前提如trumplet(检查)所说,类的改变不要太大就可以。