2012-02-17 78 views
30

所以我知道它建议在Android中使用Parcelable而不是Serializable,因为它更快。Android Parcelable和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; 
    ... 
    .... 
} 

我怎么想比肩cel MyCustomObj对象? 看来我需要再次使用序列化?但是我再次认为使用可序列化是很慢的,似乎我们别无选择,只能在这种情况下使用它。

我不明白

有人可以告诉我,我怎么会在这种情况下,包裹PersonTwo?

+2

我建议你使用Serializable。根据Nexus 5上的测试,它比Parcelable快得多。请参阅https://bitbucket.org/afrishman/androidserializationtest。要记住的主要问题是,只有使用默认设置,Serializable才会很慢。如果你使用手动序列化,它要快得多。详细信息请查看上面的链接。 – nucleo 2015-03-29 16:20:09

回答

2

您需要使MyCustomObj可以进行分类。

16

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()); 
    } 
    ............ 
} 
+2

谢谢老兄,我会接受你和ajay作为答案,但似乎我只能选择一个。无论如何谢谢你! – user1118019 2012-02-17 05:47:50

+1

是的,这是现货,我怎么做。只需要使每个对象都是必需的,因为在所有结束时,根对象将包含原始类型或字符串类型 – jonney 2013-04-04 23:23:57

-1

我想到了Parcelable对我来说是个问题。 在Android 4.3上,当数据在 之间传递为Parcelable时,我得到了未定义的异常。它适用于Android 4.0,4.2或4.4。 它应该工作时更改为可序列化,即使它更慢。

+0

好吧,这就是我在logcat中体验和看到的... – MartinC 2014-07-29 06:58:37

+2

请添加一些代码,以便还可以检出如果问题在android本身内。 – silverado 2014-10-26 16:06:11

0

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