Android Parcelable and Serializable

30

我知道在安卓中建议使用Parcelable而不是Serializable,因为它更快。

我的问题是:是否不可能避免使用Serializable呢?

如果我要序列化一个自定义对象,假设我有以下类定义:

public class Person {
   String name;
   int Age;
   ...
   ....
}

将此类设为可传递的很容易,因为Person类包含parcel.write*()支持的类型,即包括parcel.writeString和parcel.writeInt。

现在,如果Person类如下所示:

public class PersonTwo {
   MyCustomObj customObj;
   String name;
   int Age;
   ...
   ....
}

我应该如何打包MyCustomObj对象?看起来我需要再次使用serializable?但是我认为在这种情况下使用serializable很慢,似乎我们别无选择。

我不理解。

有人能告诉我在这种情况下如何打包PersonTwo吗?


2
我建议您使用Serializable。根据Nexus 5上的测试,它比Parcelable快得多。请参见https://bitbucket.org/afrishman/androidserializationtest。要记住的主要事项是,Serializable仅在默认设置下速度较慢。如果您使用手动序列化,则会快得多。有关详细信息,请查看上面的链接。 - afrish
4个回答

16

Ajay提供的链接就是你正在寻找的确切内容,你可以这样做。 实现Parcelable到你的CustomObject1,并为其创建一个Parcelable类,然后你可以使用那个Parcelable类将其打包(Parcel)在另一个Parcelable类中,该类将打包(Parcel)两个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());
    }
  ............
}

2
谢谢,伙计。我本来会接受你和Ajay的答案的,但似乎我只能选择一个。不管怎样,还是谢谢你! - user1118019
1
是的,这很准确,也是我做的方式。只需将每个对象都设置为必需的可包装对象,因为最终根对象将包含原始类型或字符串类型。 - Jono

2

您需要使MyCustomObj可进行序列化。


0
所有的复合对象也应该是可 Parcelable 的。如果你想跳过一个对象,那么不要使用它的 writeToParcel 方法。

-1

我遇到了Parcelable的问题。

在Android 4.3上,当作为Parcelable在Activity之间传递数据时,我遇到了无法解包的异常。但是在Android 4.0、4.2或4.4上可以正常工作。

如果改为Serializable,虽然速度会变慢,但应该可以解决这个问题。


2
请添加一些代码,以便我们还可以检查问题是否出在 Android 本身。 - Jakub Chromiak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接