Serializable中为什么要设置UID
2019-07-08 本文已影响0人
xulj100
1、什么是Java序列化与反序列化
Java序列化是指把Java对象保存为二进制字节码的过程,Java反序列化是指把二进制码重新转换成Java对象的过程。
2、为什么要序列化
把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中。
在网络上传送对象的字节序列。
Android里面Activity之间对象传值。
3、如何实现序列化
public class User implements Serializable{
private static final long serialVersionUID = -671958543348052007L;
private String name;
private int age;
private String gender;
public User(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
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;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
//序列化
private void writeObj() {
User user = new User("jack", 20, "man");
try {
String sdCardDir = Environment.getExternalStorageDirectory().getAbsolutePath();
FileOutputStream fos = new FileOutputStream(sdCardDir + "/user.text");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(user);
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//反序列化
private void readObj() {
try {
String sdCardDir = Environment.getExternalStorageDirectory().getAbsolutePath();
FileInputStream fis = new FileInputStream(sdCardDir + "/user.text");
ObjectInputStream ois = new ObjectInputStream(fis);
User bean = (User) ois.readObject();
Log.e("user==", bean.toString());
//打印值为 E/user==: User{name='jack', age=20, gender='man'}
} catch (ClassNotFoundException | IOException e) {
e.printStackTrace();
}
}
4、未设置serialVersionUID,修改User类属性对应的UID发生变化,反序列化失败
如果我们把User实体添加属性private String address,User类对应的SerialversionUID也变化了,而序列化和反序列化就是通过对比其SerialversionUID来进行的,一旦SerialversionUID不匹配,反序列化就无法成功,当我修改属性执行反序列化时会报以下异常:
java.io.InvalidClassException: com.hy.android.bean.User; local class incompatible: stream classdesc serialVersionUID = -6719585433480520072, local class serialVersionUID = -2385832899578140463
5、设置serialVersionUID后,修改类改User类属性,反序列化成功
private static final long serialVersionUID = -671958543348052007L;复制代码
总结:我们创建类实现Serializable的时候,防止因为修改类属性导致反序列化失败,最好设置一个serialVersionUID。