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

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

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对象序列化到磁盘以及反序列化)