美文网首页android
IPC 基础二 序列化 Serializable接口

IPC 基础二 序列化 Serializable接口

作者: 静享时光 | 来源:发表于2020-04-26 00:34 被阅读0次

    上一篇文章讲了进程间通信的概念以及多进程模式的基础知识,想了解的请移步IPC基础一

    序列化接口有两个,一个是Serializable接口,一个是Parcelable接口。其中Serializable是Java提供的,Parcelable是android提供的。下面我们先来看看Serizlizable接口。

    Serializable接口

    Serializable接口比较简单,是一个空接口,为对象提供了标准的序列化和反序列化操作。使用Serializable非常简单,只需要实现Serializable接口即可。

    serialVersionUID

    serialVersionUID不是实现Serializable必须的,但是serialVersionUID在序列化和反序列化的过程中非常重要。serialVersionUID是用来辅助序列化和反序列化工程的,原则上序列化后的数据的serialVersionUID只有和当前类的serialVersionUID相同才能够正常地被反序列化。

    序列化的过程:序列化的时候系统把当前类的serialVersionUID写入序列号的文件中,当反序列化的时候系统去检测文件中的serialVersionUID是否与当前类的serialVersionUID一致,如果一致就说明序列化的类的版本和当前类的版本时相同的,这时候就可以成功反序列化了,否则就校验失败,无法进行反序列化。

    设置serialVersionUID的方法

    1、直接手动设置一个值
    2、通过android studio生成


    Serializable.png

    然后再当前类的界面


    Serializable2.png
    即可生成对应的serialVersionUID
    Serializable序列化和反序列化的例子
      /**
         * 序列化数据
         */
        private void serializableData() {
            new Thread(new Runnable() {
                @Override
                public void run() {
    
                    Student student = new Student("xiaohong", 20);
                    Log.e("序列化", "存入的student: " + student);
                    ObjectOutputStream outputStream = null;
                    try {
                        outputStream = new ObjectOutputStream(new FileOutputStream(fileName));
                        outputStream.writeObject(student);
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        if (outputStream != null) {
                            try {
                                outputStream.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }).start();
        }
    
        /**
         * 反序列化  java.io.FileNotFoundException: /storage/emulated/0/ remote.txt (Permission denied)
         */
        private void inSerializableData() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    ObjectInputStream inputStream = null;
                    try {
                        inputStream = new ObjectInputStream(new FileInputStream(fileName));
                        Student student = (Student) inputStream.readObject();
                        if (student != null) {
                            Log.e("序列化", "获取的student:" + student + " name: " + student.getName() + " age: " + student.getAge());
                        } else {
                            Log.e("序列化", "获取的student为空");
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
    
                }
            }).start();
        }
    

    我们看下日志结果


    序列化例子.png

    从打印的日志可以看出,存入时,Student的地址是4452389,获取时student的地址是ebc8266,所以存入和取出的name和age一样,但是他们已经不是同一个对象了。
    后面把Parcelable接口讲完之后,再进行二者的比较,以及在使用时应该如何选择

    相关文章

      网友评论

        本文标题:IPC 基础二 序列化 Serializable接口

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