在 Activity 和片段之间传递对象时是否发生序列化

Does it ocurr serialization when passing objects between Activity's and Fragments

我有一个 class Crop 在将她的意图传递给另一个 Activity 时不可序列化。但如果它是从 ActivityFragment(通过 Bundles),则没有错误,我可以在另一侧看到可绘制对象,没有任何错误。

如何在一种情况下可以序列化而在另一种情况下不能序列化?

public class Crop implements Serializable {

    private String specieHarvest;
    private String specieLocation;
    private String specieName;
    private Drawable img;
}

首先,让我们回答你的问题。

您所看到的行为的原因是

  • 将对象作为附加项传递给 activity,将始终导致该对象被 Android marshaled/un-marshaled,它被认为是某种 IPC。
  • 将对象作为参数传递给 fragment 并不总是会导致您的对象被编组。

那你的对象是什么时候被Android拆开重建的,发送到一个fragment的时候?

它将不会成为serialized/de-serialized 除非片段由于某种原因被销毁并重新创建,否则,该对象是保存在地图中,当您调用 getArguments().

时,相同的对象会返回给您

如果您甚至更改 Fragment 中的那个对象,它也会更改发送的原始对象,因为它实际上是相同的引用。疯了,对吧? :)

如果你看一下Drawable class,你会发现它不是ParcelableSerializable,所以不要在intents/arguments.

相反,如果 Drawable 对象在您的资源中,则传递一个可以作为资源 ID 的整数,或者如果这是存储在本地某处的图像,您可以传递 String 路径.

此外,传递 int 或 string 会更好,因为 Drawables 大小往往较大,这可能会导致您的应用程序因 intent extras 超出大小而崩溃。

Here's 一篇您也可以阅读的文章。