在 Activity 和片段之间传递对象时是否发生序列化
Does it ocurr serialization when passing objects between Activity's and Fragments
我有一个 class Crop
在将她的意图传递给另一个 Activity
时不可序列化。但如果它是从 Activity
到 Fragment
(通过 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,你会发现它不是Parcelable
或Serializable
,所以不要在intents/arguments.
相反,如果 Drawable
对象在您的资源中,则传递一个可以作为资源 ID 的整数,或者如果这是存储在本地某处的图像,您可以传递 String
路径.
此外,传递 int 或 string 会更好,因为 Drawables
大小往往较大,这可能会导致您的应用程序因 intent extras 超出大小而崩溃。
Here's 一篇您也可以阅读的文章。
我有一个 class Crop
在将她的意图传递给另一个 Activity
时不可序列化。但如果它是从 Activity
到 Fragment
(通过 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,你会发现它不是Parcelable
或Serializable
,所以不要在intents/arguments.
相反,如果 Drawable
对象在您的资源中,则传递一个可以作为资源 ID 的整数,或者如果这是存储在本地某处的图像,您可以传递 String
路径.
此外,传递 int 或 string 会更好,因为 Drawables
大小往往较大,这可能会导致您的应用程序因 intent extras 超出大小而崩溃。
Here's 一篇您也可以阅读的文章。