【问题标题】:Android Parcelable and SerializableAndroid Parcelable 和 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 仅在默认设置下很慢。如果您使用手动序列化,它会快得多。详情请查看以上链接。

标签: android serialization android-intent parcelable parcel


【解决方案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 本身。
      猜你喜欢
      • 2019-01-11
      • 2015-12-20
      • 2015-08-29
      • 2017-05-05
      • 2021-09-23
      • 2011-06-19
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      相关资源
      最近更新 更多