Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Bundle.putSerializable序列化引用,不是值?_Java_Android_Serializable - Fatal编程技术网

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

Java Bundle.putSerializable序列化引用,不是值?,java,android,serializable,Java,Android,Serializable,编辑::更新代码以显示我关心的问题:更改Frag中的mData属性将更改Sender中的mData属性,并且它们的内存引用是相同的 我通过bundle将自定义数据类传递到子视图中,目的是将数据返回给父视图。因此,我的数据对象作为引用传递是很方便的,因此可以直接进行操作 然而,从iOS来看,这当然与函数式编程背道而驰。我只是好奇,我是否需要做更多的工作来实现Serializable?或者,是否打算让putSerializable序列化引用,而不是值 class Sender{ DataCl

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

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

然而,从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
}
类发送器{
DataClass mData=新的DataClass();
void openFragment(){
Bundle=新Bundle();
bundle.putSerializable(“Key”,mData);
Frag Frag=新Frag();/@6945
//编辑以供测试
{
testForEquality(bundle);
}
frag.setArguments(bundle);
pushFragment(frag);//使新视图显示在顶部
}
无效testForEquality(捆绑包){
DataClass newData=(DataClass)bundle.getSerializable(“Key”);
Log.e(“Equal”,“”+(newData==mData);//TRUE
}
}
类碎片{
创建视图上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
DataClass mData=(DataClass)getArguments().getSerializable(“键”);/@6945
mData.stringA=“不同的字符串值”;//更改此处和发送方中的值
}
}
类DataClass扩展BaseDataClass实现可序列化{
//一些字符串
//某个ArrayList
//一些枚举
//一些错误
}

实现Serializable接口确实足以使类可序列化。但是,在片段中更改mData上的任何内容都不会影响发送方类中的mData,因为传递的不是引用。

当序列化对象并将其传递给同一应用程序中的其他活动时,则对象的新副本w这是因为与活动的通信涉及IPC,所以Bundle将被封送到byte[]中,并在目标中使用相同的内容构造新对象

将对象放入Bundle以发送到Fragment(作为参数)时,对象保存在Bundle的内部映射中。将参数发送到Fragment不涉及任何进程间通信,因此不需要以字节[]进行编组。因此,
Fragment
将获得与您从发件人活动发送的对象相同的对象。如果您在片段中修改对象,发件人活动中的对象也将更改


如果您只想传递值,那么Android实现它的方法是实现
Parcelable
。您可以参考这篇文章来描述这种方法。

除非我读错了什么,否则它会影响我的Sender类中的mData。很抱歉没有说清楚。如果传递的不是引用,为什么是Sender.mData和Frag.mData两个@6945?编辑了问题和代码,添加了一些额外的信息,以使问题更加清晰。我在下面提出了一个答案。它解释了地址相同的原因。我仍然想通过将序列化数据写入文件、重新启动应用程序并再次阅读来测试它,但我以后必须这样做。我仍然不明白这个问题是如何解决的当唯一的外部答案是错误的时,on被否决了…,关于Parcelable的部分+1!但是你能重写上半部分吗?听起来像是第二个副本,但是现在当你编辑一个Android系统(或Java?)时两者都编辑。另外,是说引用传递正确吗?当然。让我重新检查一下udpated answerWell,你可以暗示。因为序列化是一个契约,当需要封送或解封时将执行。但是有一种情况,使用片段的序列化可能会产生不同的对象。这种情况是:如果由于内存泄漏或其他内存限制而销毁并再次创建片段。在这种情况下,将进行编组并创建新对象。TriiIcky:)