java.io.invalidclassexception: test.test1; local class incompatible: stream classdesc serialversionuid = 9097989105451761251, local class serialversionuid = -7756223913249050270
at java.base/java.io.objectstreamclass.initnonproxy(objectstreamclass.java:689)
at java.base/java.io.objectinputstream.readnonproxydesc(objectinputstream.java:1903)
at java.base/java.io.objectinputstream.readclassdesc(objectinputstream.java:1772)
at java.base/java.io.objectinputstream.readordinaryobject(objectinputstream.java:2060)
at java.base/java.io.objectinputstream.readobject0(objectinputstream.java:1594)
at java.base/java.io.objectinputstream.readobject(objectinputstream.java:430)
at test.serialtest.main(serialtest.java:11)
为了提高serialversionuid的独立性和确定性,强烈建议在一个可序列化类中显示地定义serialversionuid,为他赋予明确的值。
那么在idea中,怎么手动生成呢?
在settings->editor->inspections下,搜索serial,开启serializable class without 'serialversionuid'的拼写检查,然后将光标放在实现serializable的接口上,按住alt+enter键,选择添加serialversionuid即可。 transient关键字
transient修饰类的变量,可以使变量不被序列化。反序列化时,被transient修饰的变量的值被设为初始值,如int类型被设为0,对象型被设为null。 objectoutputstream类和objectinputstream类
objectoutputstream的writeobject方法可以序列化对象,objectinputstream的readobject可以反序列化对象。objectoutputstream实现了接口objectoutput,所以可以进行对象写操作。objectinputstream实现了接口objectinput,所以可以对对象进行读操作。 静态变量序列化
给test类中增加一个静态变量,赋值为12,然后在序列化之后修改其值为10,反序列化之后打印它的值。发现打印的值为10,之前的12并没有被保存。
静态变量是不参与序列化的,序列化只是用来保存对象的状态,而静态变量属于类的状态。 父类序列化
让test继承一个没有实现serializable接口的类,设置父类中变量的值,对test类的实例进行序列化与反序列化操作。
public class serialtest {
public static void main(string[] args) {
test test = new test();
test.setname("huihui");
test.setsex(12);
// 序列化,存储对象到文本
objectoutputstream oos = null;
try {
oos = new objectoutputstream(new fileoutputstream("test"));
oos.writeobject(test);
} catch (ioexception e) {
e.printstacktrace();
} finally {
try {
if (oos != null) {
oos.close();
}
} catch (ioexception e) {
e.printstacktrace();
}
}
// 反序列化,从文本中取出对象
objectinputstream ois = null;
try {
ois = new objectinputstream(new fileinputstream("test"));
test test1 = (test) ois.readobject();
system.out.println(test1);
} catch (ioexception | classnotfoundexception e) {
e.printstacktrace();
} finally {
try {
if (ois != null) {
ois.close();
}
} catch (ioexception e) {
e.printstacktrace();
}
}
}
}
class test extends testfather implements serializable {
private static final long serialversionuid = 4335715933640891747l;
private string name;
public string getname() {
return name;
}
public void setname(string name) {
this.name = name;
}
@override
public string tostring() {
return "test{" +
"name='" + name + '\'' +
"sex='" + sex + '\'' +
'}';
}
}
class testfather {
protected integer sex;
public integer getsex() {
return sex;
}
public void setsex(integer sex) {
this.sex = sex;
}
@override
public string tostring() {
return "testfather{" +
"sex='" + sex + '\'' +
'}';
}
}