Bundle.putSerializable 序列化引用,而不是值?

Mar*_*ars -1 java android serializable

编辑:: 更新代码以显示我关注的问题:更改 Frag 中 mData 的属性会更改 Sender 中的属性 mData 并且它们的内存引用相同..

我正在通过包将自定义数据类传递到子视图中,目的是将数据返回给父视图。因此,我的数据对象作为引用传递很方便,因此可以直接操作。

然而,来自 iOS,这当然是反对函数式编程的。我在这里主要只是好奇,我是否需要做更多的事情来实现 Serializable?或者是打算让 putSerializable 序列化引用,而不是值?

class Sender{

   DataClass mData = new DataClass();
   void openFragment(){
     Bundle bundle = new Bundle();
     bundle.putSerializable("Key", mData);
     Frag frag = new Frag();  //@6945

     //EDIT for test
     {
       testForEquality(bundle);
     }
     frag.setArguments(bundle);
     pushFragment(frag);//Makes a new view appear on top
   }

   void testForEquality(Bundle bundle){
     DataClass newData = (DataClass) bundle.getSerializable("Key");
     Log.e("Equal", "" + (newData == mData); //TRUE
   }
}

class Frag{
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance){

    DataClass mData = (DataClass) getArguments().getSerializable("Key"); //@6945
    mData.stringA = "Different string value"; //Changes value here AND in Sender
  }
}

class DataClass extends BaseDataClass implements Serializable{
  //Some strings
  //Some ArrayList<Integers>
  //Some enums
  //Some Errors
}
Run Code Online (Sandbox Code Playgroud)

Sag*_*gar 6

当您序列化一个对象并将其传递给同一应用程序中的其他活动时,将创建对象的新副本。这是因为与活动的通信涉及 IPC,因此 Bundle 将被编组到 byte[] 中,并在目标中构造具有相同内容的新对象。

当您将一个对象放入 Bundle 以发送到 Fragment(作为参数)时,这些对象保存在 Bundle 的内部映射中。向 Fragments 发送参数不涉及任何进程间通信,因此不需要在 byte[] 中编组。结果Fragment将获得您从发件人活动发送的相同对象。如果修改 Fragment 中的对象,则发送方 Activity 中的对象也会发生变化。

如果你只想传递值,那么 Android 实现它的方法是实现Parcelable. 您可以参考描述这种方法的这个SO