美文网首页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简介(二)

    IPC简介(二) Serializable和Parcelable接口可以完成对象的序列化过程,当需要通过Inten...

  • IPC 基础二 序列化 Serializable接口

    上一篇文章讲了进程间通信的概念以及多进程模式的基础知识,想了解的请移步IPC基础一 序列化接口有两个,一个是Ser...

  • Android十八章:多进程基础

    IPC基础分享 这一章主要讲述多进程的作用,序列化和反序列化,Serializable和Parcelable ​ ...

  • android IPC机制讲解(二)

    IPC基础概念介绍 介绍一下IPC中的一些基础概念,主要包含三个方面内容:Serializable接口,Parce...

  • IPC基础概念介绍

    2.3 IPC基础概念介绍 本节主要介绍IPC中的一些基础概念,主要包含三方面的内容;Serializable接口...

  • 2.3 IPC基础概念介绍(一)

    1. Serializable接口 定义User类,实现Serializable接口 序列化和反序列化 打印结果:...

  • Java 序列化之 Externalizable

    相关文章: Java 序列化 之 Serializable JDK中除了提供 Serializable 序列化接口...

  • Parcelable 和Serializable浅析

    Serializable 接口 Serializable 是java 提供的一个序列化接口,它是一个空接口,为对象...

  • serializable相关

    18.7.19序列化serializable 一、概述需要被序列化的类需要实现Serializable接口一个对象...

  • Java基础之Externalizable

    Externalizable是Serializable子类,Serializable接口是将整个对象序列化,而Ex...

网友评论

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

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