Person类实现Serializable接口,编译器会提出这样的警告:
serializable 类 Person 未声明类型为 long 的静态终态 serialVersionUID 字段
按照编辑器的提示,选择第一个修正提示时会出现这么个提示(见下图--提示图)
这个对话框提示是什么意思?选择不同的选项,会有什么影响??
class Person implements Serializable
{
//private static final long serialVersionUID = 8015816128546794345L;这个是按照第一个修正方法,添加缺省串行标识
//private static final long serialVersionUID = 1L; 这个是按照第二个修正方法,添加已生成串行标识
// 问题是:为何要添加这个serialVersionUID ,不添加有何影响,这两种不同的添加方式有何异同
private int age=10;
public String name="张三";
public Person() {
public static void main(String[] args) throws Exception {
//writeObj();
readObj();
}
public static void readObj() throws Exception {
ObjectInputStream ois = new ObjectInputStream(
new FileInputStream("MyPerson.object"));
MyPerson p = (MyPerson)ois.readObject();
System.out.println(p);
ois.close();
}
public static void writeObj() throws Exception {
ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("MyPerson.object"));
oos.writeObject(new MyPerson("zhangsan", 29));
oos.close();
}
}
复制代码
package com.itheima.test;
import java.io.Serializable;
class MyPerson implements Serializable {
/**
*
*/
private static final long serialVersionUID = -6527801543108636145L;
/**
*
*/
//private static final long serialVersionUID = 1L;
private String name;
public int age;
public MyPerson(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "MyPerson [name=" + name + ", age=" + age + "]";
}
}
复制代码
运行结果:
MyPerson [name=zhangsan, age=29]
复制代码
我把MyPerson类的属性name的权限修改为privat后,运行,报错结果为:
Exception in thread "main" java.io.InvalidClassException: com.itheima.test.MyPerson; local class incompatible: stream classdesc serialVersionUID = 6549094864754487897, local class serialVersionUID = -6527801543108636145
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:604)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1601)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1514)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1750)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
at com.itheima.test.ObjectStreamTest.readObj(ObjectStreamTest.java:20)
at com.itheima.test.ObjectStreamTest.main(ObjectStreamTest.java:12)