美文网首页
Serializable中为什么要设置UID

Serializable中为什么要设置UID

作者: xulj100 | 来源:发表于2019-07-08 11:57 被阅读0次

    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。

    相关文章

      网友评论

          本文标题:Serializable中为什么要设置UID

          本文链接:https://www.haomeiwen.com/subject/svlohctx.html