Android开发中,SerializableParcelable是两种用于完成目标序列化的常见办法。在面试中,关于这两种技能的了解和运用能力常常被用来评估一个Android开发者的水平。本文将环绕SerializableParcelable展开一系列高档疑难的面试问题,并深化探讨它们的原理、优劣势以及实际运用中的技巧。

了解与运用

问题: 解释Serializable和Parcelable的区别,以及它们在Android中的运用场景。

起点: 在答复这个问题时,需求深化了解Serializable和Parcelable的完成原理及其在Android中的功能影响,以及在不同场景下的选择。

参阅简答:

  • Serializable:

    • SerializableJava供给的一种序列化接口,经过完成Serializable接口,目标可以被序列化为字节流,便于存储或网络传输。
    • Android中,Serializable可以直接用于序列化目标,但其功能相对较差,因为它运用反射机制,会产生很多暂时目标,导致内存占用较高,序列化和反序列化速度较慢。
    • 适用于简略目标或不需求频繁序列化的情况下,例如存储在SharedPreferences中的配置信息等。
  • Parcelable:

    • ParcelableAndroid供给的一种序列化机制,专门针对Android渠道进行了优化,比较Serializable有更高的功能。
    • Parcelable的完成原理是将目标分解为原始数据类型,经过writeToParcel()办法写入Parcel目标,再经过CREATOR反序列化。
    • Android中,引荐运用Parcelable来传递杂乱目标,特别是在需求频繁传递目标时,Parcelable的功能更佳。

运用场景:

  • 当需求在ActivityFragmentService之间传递杂乱目标时,引荐运用Parcelable,以进步功能。
  • 关于一些简略的目标,如配置信息等,可以考虑运用Serializable,但需求留意其功能影响。

问题: 怎么完成一个杂乱目标的Parcelable序列化?

起点: 调查面试者关于Parcelable的完成细节和杂乱目标的序列化进程的了解能力。

参阅简答:

完成一个杂乱目标的Parcelable序列化需求以下进程:

  1. 在目标类中完成Parcelable接口,并重写writeToParcel()createFromParcel()办法。
  2. writeToParcel()办法中,将目标的各个字段写入Parcel目标中,留意字段的次序和类型要与读取时坚持一致。
  3. createFromParcel()办法中,读取Parcel目标中的数据,并返回一个新的目标。
  4. 在目标的结构函数中增加一个Parcelable参数,用于从Parcel目标中创立目标。
  5. 处理List可以运用writeList()readList()办法来写入和读取List类型的数据。
public class MyObject implements Parcelable {
    private List<String> stringList;
    private Map<String, Integer> stringMap;
    protected MyObject(Parcel in) {
        stringList = new ArrayList<>();
        in.readList(stringList, String.class.getClassLoader());
        stringMap = new HashMap<>();
        in.readMap(stringMap, String.class.getClassLoader());
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeList(stringList);
        dest.writeMap(stringMap);
    }
    @Override
    public int describeContents() {
        return 0;
    }
    public static final Creator<MyObject> CREATOR = new Creator<MyObject>() {
        @Override
        public MyObject createFromParcel(Parcel in) {
            return new MyObject(in);
        }
        @Override
        public MyObject[] newArray(int size) {
            return new MyObject[size];
        }
    };
}

问题: 为什么在Android开发中引荐运用Parcelable而不是Serializable?

起点: 调查面试者关于功能优化的注重程度,以及关于Android开发最佳实践的了解。

参阅简答:

  • Android官方引荐运用Parcelable而不是Serializable的主要原因是功能问题。Parcelable是在内存中进行数据传输的,比较SerializableIO操作愈加高效。
  • Android开发中,功能往往是至关重要的,尤其是在需求频繁传递很多数据目标的场景下,如Activity之间传递数据、Fragment之间传递数据等。
  • 此外,Parcelable比较Serializable在代码完成上更为杂乱,可是可以经过代码生成工具来简化完成进程,如Android Studio供给的Parcelable插件。

留意事项

问题: 在完成Parcelable时有哪些需求留意的地方?

起点: 面试官期望了解面试者对完成Parcelable进程中或许遇到的问题和留意事项的把握程度。

参阅简答:

  • 内存分配: 在完成Parcelable时需求留意内存分配,尽量避免不必要的内存开销。

  • 数据结构的改变: 在运用Parcelable时,假如目标的数据结构发生改变,例如新增了字段或者改变了字段类型,需求手动修正Parcelable的完成,否则会导致反序列化失利。

  • 字段次序: 写入和读取Parcel时字段的次序必须坚持一致,否则会导致数据错误。

  • 字段为null的处理: 当字段或许为null时,需求在写入和读取字段时做非空判别,否则会抛出NullPointerException。解决方案是在写入和读取字段时进行判空处理。

  • 跨进程传输问题: 假如运用Parcelable在跨进程传输数据时,需求确保一切相关的类都是可序列化的,而且数据量不要过大,避免导致TransactionTooLargeException异常。

  • 版别兼容性: 在对Parcelable目标进行更新时,需求考虑版别兼容性,尽量坚持向后兼容,以避免出现因版别不一致而导致的错误。

功能相关

问题: 请分析Serializable和Parcelable在功能上的差异。

起点: 面试官期望了解面试者对它们之间的功能差异的影响知道的方向有哪些

参阅简答:

SerializableParcelable在功能上的差异主要体现在序列化和反序列化的速度和内存耗费上。

  • 序列化和反序列化速度:Parcelable通常比Serializable更快,因为Parcelable是根据Android底层机制完成的,序列化和反序列化进程更高效。根据实际测试数据,Parcelable的功能可以比Serializable提高数倍。

  • 内存耗费:因为Serializable是根据Java标准库完成的,序列化和反序列化进程需求创立很多的暂时目标,导致内存耗费较大;而Parcelable的序列化和反序列化进程愈加精细,内存耗费较少。

问题: 怎么优化Serializable和Parcelable的功能?

起点: 面试官期望了解面试者关于提高Serializable与Parcelable功能的办法。

参阅简答:

Serializable:

  • 尽量削减需求序列化的目标特点
  • 运用transient关键字符号不需求序列化的特点
  • 运用自界说的序列化机制

Parcelable:

  • 运用高效的数据结构界说目标
  • 尽量削减需求序列化的目标特点
  • 运用自界说的Parcelable完成

总结

本文环绕SerializableParcelable展开了一系列高档疑难的面试问题,并供给了具体解答。了解并把握这两种序列化办法的原理、优劣势以及适用场景关于Android开发者来说至关重要。

引荐

android_startup: 供给一种在运用发动时可以愈加简略、高效的办法来初始化组件,优化发动速度。不只支持Jetpack App Startup的悉数功能,还供给额定的同步与异步等候、线程操控与多进程支持等功能。

AwesomeGithub: 根据Github的客户端,纯练习项目,支持组件化开发,支持账户暗码与认证登陆。运用Kotlin语言进行开发,项目架构是根据JetPack&DataBinding的MVVM;项目中运用了Arouter、Retrofit、Coroutine、Glide、Dagger与Hilt等流行开源技能。

flutter_github: 根据Flutter的跨渠道版别Github客户端,与AwesomeGithub相对应。

android-api-analysis: 结合具体的Demo来全面解析Android相关的知识点, 协助读者可以更快的把握与了解所阐述的关键。

daily_algorithm: 每日一算法,由浅入深,欢迎参加一同共勉。