包裹中的“ createTypedArrayList()”和“ readTypedList()”之间的区别

时间:2018-09-09 10:09:39

标签: android serialization deserialization parcelable parcel

反序列化可打包对象时,我通常使用方法createTypedArrayList (Creator<T> c)来读取可拆分数组列表。

我最近发现了另一种方法readTypedList (List<T> list, Creator<T> c),它似乎在做同样的事情。甚至文档看起来也一样。除了实现 * 之外,它们之间还有什么区别吗?

*:前者创建新的数组列表,后者将追加到现有数组列表中

1 个答案:

答案 0 :(得分:3)

readTypedList()createTypedArrayList()都与writeTypedList()的“写”操作一起被写为“读”操作。由于它们都必须使用完全相同的数据进行操作,因此它们之间的差异相对较小。

一个明显的区别是readTypedList()将“填满”您想要的任何List实现(例如LinkedList等),而createTypedArrayList()只会返回一个ArrayList

另一个是readTypedList() 允许,如果您需要连续运行多个“读取”操作,则避免分配多个List实例;您可以将相同的List实例传递给readTypedList()的每次调用,然后再处理其内容。 readTypedList()将正确覆盖现有数据,并根据需要增加/缩小列表以完全适合所有新读取的数据。另一方面,createTypedArrayList()将始终返回新的ArrayList实例。

不过,最大的区别可能是您在阅读null列表时的行为。如果配对的“写”操作为dest.writeTypedList(null),则createTypedArrayList()可以返回null的值...但是readTypedList()只能清除现有的传入列表,留下一个空的非空列表。这使得从根本上讲不出先前编写的列表是null还是空列表,因此,我始终使用createTypedArrayList()

除此之外,没有任何区别。两者都使用Creator.createFromParcel()来实际检索基础数据,并且都可以处理列表中的null元素。同样,这两种方法都应与writeTypedList()配对,因此它们之间发生变化的可能性非常有限。