serialVersionUID的作用

如果没有设置这个值,你在序列化一个对象之后,改动了该类的字段或者方法名之类的,那如果你再反序列化想取出之前的那个对象时就可能会抛出异常,因为你改动了类中间的信息,serialVersionUID是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,当修改后的类去反序列化的时候发现该类的serialVersionUID值和之前保存在问价中的serialVersionUID值不一致,所以就会抛出异常。

而显示的设置serialVersionUID值就可以保证版本的兼容性,如果你在类中写上了这个值,就算类变动了,它反序列化的时候也能和文件中的原值匹配上。而新增的值则会设置成null,删除的值则不会显示。


一个类实现了Serializable接口,如果没有定义serialVersionUID,Eclipse会提供这个

提示功能告诉你去定义


package com.sxit;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.Serializable;

public class Serializable01 extends Object implements Serializable{

private static final long serialVersionUID = -1466479389299512377L;

public byte b = 12;

public byte getB() {

return b;

}

public void setB(byte b) {

this.b = b;

}

public static void main(String[] args) {

try {

FileOutputStream fos = new FileOutputStream(new File("E:\\tmp\\demo2.txt"));

ObjectOutputStream os = new ObjectOutputStream(fos);

Serializable01 s = new Serializable01();

os.writeObject(s);

os.flush();

os.close();

FileInputStream fis = new FileInputStream(new File("E:\\tmp\\demo2.txt"));

ObjectInputStream ois = new ObjectInputStream(fis);

Serializable01 s2 = (Serializable01)ois.readObject();

System.out.println(s2.getB());

ois.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容