【问题标题】:Android putSerializable vs putStringAndroid putSerializable 与 putString
【发布时间】:2015-11-14 13:13:24
【问题描述】:

我有一个这样定义的 POJO 对象:

public class MYPOJO implements Serializable {

    int myint;
    String mystring;
}

然后当我将信息传递给活动时,我会这样做:

Intent i = new Intent(this, WearActivity.class);
        Bundle b = new Bundle();
        MYPojo pojo = new MYPojo();
        pojo.mystring="cool";
        b.putSerializable("someString", pojo.mystring);//this line is my issue
        i.putExtra("coolBundle",b);

        startActivityForResult(i, 0);

并阅读额外的“someString”:

Bundle b2 = getIntent().getBundleExtra("coolBundle");
        b2.getString("someString");

所以现在我的问题是:如果我在最后我仍然要求检索 b2.getString("someString") :

b.putString("someString",pojo.mystring) 

对比

b.putSerializable("someString",pojo.mystring) ?

【问题讨论】:

  • 你的 POJO 可能应该实现 Parcelable。更多可以找到here
  • 我意识到它应该实现 paracelable 以提高效率并避免反射。但是我想知道如果我使用 putString 而不是 putSerializable 是否有任何问题。它只是我继承了一个不使用 parcelable 的项目,我想知道那里的设计决策。我看到他们调用 putSerializable(...) 并在那里通过 getString(...) 检索它,这似乎很奇怪,我想要一个解释。没有崩溃,两种方法似乎都有效,但是否有使用其中任何一种的设计考虑?
  • 好吧,我相信你可以传入一个字符串,因为它本质上是一个字符数组,它允许它是可序列化的。对我来说,在 String 周围放置一个包装器就是在一个包装器周围放置一个包装器。这听起来像是一种设计选择,而我不会这样做
  • 我想我的意思是,如果您只传递一个字符串,请使用 put/get 字符串方法。如果您要传递带有更多数据的 POJO,请实现 parcelable。可序列化有效,但您似乎意识到了效率/反射参数。
  • 如果需要,您可以发布官方答案以供考虑。

标签: android android-intent serializable


【解决方案1】:

在实践中,除了“效率”或可能使用反射/安全性之外,传递字符串或在活动之间传递可序列化字符串之间没有区别。将字符串作为“可序列化”传入时,这可能更像是一个设计和原则问题。本质上,通过将 String 作为 Serializable 传递,Android/Java 将利用 String 的包装器,它在幕后包含 char[] 的数据结构。

TLDR;如果您的 POJO 包含更多数据,我强烈建议您实施 Parcelable。更多信息可以在这个 SO 答案here 中找到。但如果你只传递一个字符串,我会使用 Android 为我们提供的 putString/getString 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2019-05-05
    • 1970-01-01
    相关资源
    最近更新 更多