美文网首页
Android Parcelable对象序列化到磁盘以及反序列化

Android Parcelable对象序列化到磁盘以及反序列化

作者: 秋不白 | 来源:发表于2019-05-05 18:37 被阅读0次

    前言:抱着最起码的要求尽力去做好每一件事 !——秋不白

    Parcelable 序列化到磁盘和反序列化

    内容如题,仅个人探讨,以下代码都测试通过。

            记录一次面试经历:面试官问到Serializable和Parcelable 的主要区别是什么,我说把知道的说一边,效率,S属于java api,P属于Android ,以及序列化的使用场景。他说不对,然后说S是系列化到磁盘,P是序列化到内存。我就百思不得其姐,在这里心里给我个启示,要加强基础以及一定层度的去了解原理(看个人情况)。

         查找资料 以及根据AS自动生成的代码,可以理解,Parcelable的序列化和反序列化操作实际是,Parcel内部包装了可序列化的数据,也就是说序列化的时候,将数据放入,parcel的write方法,反序列化是通过CREATOR来完成的,通过获取当前线程的上下文加载器,并通过parcel的read方法,来完成反序列化操作。代码如下

    具体的序列化和反序列化

    //将parcelable 对象序列化到磁盘

                case R.id.testParcelable:

                    File file = new File(PathUtil.getAppDocPath() + "testParcelable.txt");

                    try {

                        if (!file.exists()) {

                            file.createNewFile();

                        }

                        Person p = new Person(1, "XueQin");

                        FileOutputStream out = (new FileOutputStream(file));

                        BufferedOutputStream bos = new BufferedOutputStream(out);

                        Parcel parcel = Parcel.obtain();

                        parcel.writeParcelable(p,0);

                        bos.write(parcel.marshall());

                        bos.flush();

                        bos.close();

                        out.flush();

                        out.close();

                    } catch (IOException e) {

                        e.printStackTrace();

                    }

                    break;

                    //反序列化parcelable对象

                case R.id.readParcelable:

                    try {

                        File file2 = new File(PathUtil.getAppDocPath() + "testParcelable.txt");

                        FileInputStream in = new FileInputStream(file2);

                        byte[] bytes = new byte[in.available()];

                        in.read(bytes);

                        Parcel parcel = Parcel.obtain();

                        parcel.unmarshall(bytes, 0, bytes.length);

                        parcel.setDataPosition(0);

                        Person person = parcel.readParcelable(Thread.currentThread().getContextClassLoader());

                        in.close();

                        LogUtils.e(TAG, person.toString());

                    } catch (IOException e) {

                        e.printStackTrace();

                    }

                    break;

    以及parcel的readParcelable的源码,可以参考下,通过当前线程的上下文类加载器获取到CREAOR对象。

    总结:知识如浩瀚的海洋,加油吧,我们一起。

    相关文章

      网友评论

          本文标题:Android Parcelable对象序列化到磁盘以及反序列化

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