Android Parcelable 和 Serializable
Posted
技术标签:
【中文标题】Android Parcelable 和 Serializable【英文标题】:Android Parcelable and Serializable 【发布时间】:2012-03-08 13:05:32 【问题描述】:所以我知道建议在 android 中使用 Parcelable 而不是 Serializable,因为它更快。
我的问题是:避免使用 Serializable 是不可能的吗?
如果我有一个想要序列化的自定义对象,假设我有以下类定义
public class Person
String name;
int Age;
...
....
使这个 parcelable 很容易,因为 Person 类包含 parcel.write*() 支持的类型,即有 parcel.writeString 和 parcel.writeInt
现在,如果 Person 类如下:
public class PersonTwo
MyCustomObj customObj;
String name;
int Age;
...
....
我应该如何打包 MyCustomObj 对象? 看来我需要再次使用可序列化?但同样,我认为使用可序列化是很慢的,而且似乎我们别无选择,只能在这种情况下使用它。
我不明白
谁能告诉我在这种情况下我将如何打包 PersonTwo?
【问题讨论】:
我建议你使用Serializable。根据对 Nexus 5 的测试,它比 Parcelable 快得多。见bitbucket.org/afrishman/androidserializationtest。要记住的主要事情是 Serializable 仅在默认设置下很慢。如果您使用手动序列化,它会快得多。详情请查看以上链接。 【参考方案1】:Ajay 提供的链接正是您要查找的内容,以及您如何做到这一点。
好吧,你可以做的是实现 Parcelable
到你的 CustomObject1
并为它创建一个 Parcelable
类,然后你可以使用 Parcelable
类到 Parcel
它在另一个 Parcelable
类中,这将包裹两者CustomObjects
。
public class CustomObject1 implements Parcelable
// parcelable code CustomObject1
public class CustomObject2 implements Parcelable
private CustomObject1 obj1;
// add CustomObject1 here with getter setter
// parcelable code for CustomObject2
@Override
public void writeToParcel(Parcel dest, int flags)
dest.writeParcelable(obj1, flags);
private void readFromParcel(Parcel in)
obj1 = in.readParcelable(CustomObject1.class.getClassLoader());
............
【讨论】:
谢谢老兄,我会接受你和 ajay 作为答案,但似乎我只能选择一个。无论如何,谢谢! 是的,这是正确的,我是如何做到的。只需使每个需要的对象都可以打包,因为最后,根对象将包含原始类型或字符串类型【参考方案2】:您需要使 MyCustomObj 可打包。
【讨论】:
【参考方案3】:所有复合对象也应该是 Parcelable。如果您想跳过一个对象,请不要使用它的 writeToParcel 方法。
【讨论】:
【参考方案4】:我指出 Parcelable 对我来说是个问题。 在 Android 4.3 上,当在 活动为 Parcelable。它在 Android 4.0、4.2 或 4.4 上运行良好。 更改为 Serializable 后它应该可以工作,尽管速度较慢。
【讨论】:
请添加一些代码,以便还可以检查问题是否出在 android 本身。以上是关于Android Parcelable 和 Serializable的主要内容,如果未能解决你的问题,请参考以下文章
Android中Serializable和Parcelable序列化对象详解
Android Parcelable和Serializable的区别