【问题标题】:How to read/write a List<Date> to a Parcel?如何将 List<Date> 读/写到 Parcel?
【发布时间】:2012-12-29 17:03:26
【问题描述】:

我有一个实现Parcelable 的类。将ListDate 对象读/写到Parcel 的最佳方法是什么?

这就是您可以为单个 Date 对象执行此操作的方法:

    date = new Date(parcel.readLong()); //read

    parcel.writeLong(date.getTime());   //write

但是对于List&lt;Date&gt;怎么办呢?

我认为写操作的笨拙方式是遍历所有Date 对象并构造一个long[],如下所示:

long[] datesAsLongs = new long[dates.size()];
for (int i = 0; i < dates.size(); i++)
    datesAsLongs[i] = dates.get(i).getTime();
parcel.writeLongArray(datesAsLongs);

要阅读,你可以这样做:

dates = new ArrayList<Date>();
for (long dateAsLong : parcel.createLongArray())
    dates.add(new Date(dateAsLong));

但我希望会有更好的东西......

【问题讨论】:

    标签: android date serialization parcelable parcel


    【解决方案1】:

    由于 Date 是一个可序列化的对象,你应该可以使用writeList()

    List<Date> list = new ArrayList<Date>();
    parcel.writeList(list);
    

    ArrayList 还实现了 Serializable,因此您可以使用writeValue()

    List<Date> list = new ArrayList<Date>();
    parcel.writeValue(list);    
    

    最坏的情况你可以使用writeSerializable()

    【讨论】:

    • 是的,我已经考虑过了,但是List 没有实现Serializable(尽管ArrayList 实现了),所以你必须强制转换它。如果可能的话,我不想那样做。更不用说writeSerializable() 对性能有影响......
    • List 是一个接口,它不能实现 Serializable,你的 List&lt;Date&gt; 对象实际上是一个具有 List 方法的 Dates 的 ArrayList。我不清楚你为什么没有使用writeList()。通过“更不用说 writeSerializable() 对性能有影响......”我假设您已经阅读了 Parcel 文档,但是您是否阅读了关于 Untyped Containers 的选择? readList()writeList() 是你想要的方法。
    • 不,我的Date 对象列表不能保证是ArrayList... 它所在的类有一个公共setDates(List&lt;Date&gt; dates) setter,所以我不能假设它总是一个ArrayList。这就是为什么我特意在这个问题的标题中写了List&lt;Date&gt;。不过,感谢您的回答。
    • 我明白了。虽然 I 可能过于短视,无法在这里考虑其他类型的 List 实现,但开发人员却没有。我刚刚使用 LinkedList、Stack 和 Vector 测试了 writeList()readList()。我还查看了源代码,这些方法应该适用于实现 List 的 any 类。
    • "你知道 Date 对象的这种通用序列化是否会降低性能吗?"我做了一些简单的测试,并没有发现明确的区别......但是考虑到文档警告,您应该写一个便笺,以便在完成应用程序编写后在 DDMS 中仔细检查自己。
    猜你喜欢
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 2020-01-04
    • 2017-03-02
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多