android

IPC 基础二 序列化 Serializable接口

2020-04-26  本文已影响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接口讲完之后,再进行二者的比较,以及在使用时应该如何选择

上一篇 下一篇

猜你喜欢

热点阅读