Serializable中为什么要设置UID

1、什么是Java序列化与反序列化

Java序列化是指把Java对象保存为二进制字节码的过程,Java反序列化是指把二进制码重新转换成Java对象的过程。

2、为什么要序列化

  • 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中。
  • 在网络上传送对象的字节序列。
  • Android里面Activity之间对象传值。

3、如何实现序列化

public class User implements Serializable{

    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.txt");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(user);
        oos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

//反序列化
private void readObj(){
    try {
        String sdCardDir = Environment.getExternalStorageDirectory().getAbsolutePath();
        FileInputStream fis = new FileInputStream(sdCardDir+"/user.txt");
        ObjectInputStream ois = new ObjectInputStream(fis);
        User bean = (User) ois.readObject();
        Log.e("---",bean.toString());
        //打印值为  E/---: User{name='jack', age=20, gender='man'}

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException 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。


转载于:https://juejin.im/post/5ba1b9cd5188255c7566c23f

你可能感兴趣的:(Serializable中为什么要设置UID)