2017-06-22 94 views
-3

编辑::更新的代码来显示我关心的事情:更改碎片中的mData更改发件人中的mData。Bundle.putSerializable序列化引用,而不是值?

我通过捆绑将自定义数据类传递到子视图,意图将数据返回给父级。因此,我的数据对象作为参考传递很方便,因此可以直接操作。

但是,来自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 
} 
+0

我还没有看到,当唯一的外部答案是错的这个问题是怎么downvoted ... – Mars

回答

0

可能的结论:
总之,Bundle.putSerializable串行化的基准的值,而不是对象的值被引用。

我在期待Bundle.putSerializable会序列化我的对象并传递对象的值。相反,它似乎putSerializable序列化对象引用的值,换句话说,它的地址。

含义Frag.mData是一个新的引用,它接收Sender.mData的地址,因此mData.stringA =“new string”更改位于Sender.mData和Frag.mData当前指向的地址处的对象。

知道这仍然不能解决我想要序列化对象的问题,但我想这是一个不同的问题。

参见:Is Java "pass-by-reference" or "pass-by-value"?

编辑:如何序列化,而不是参考价值::

,实际上产生一个新的副本解决办法的对象:

·发件人使用ByteArrayOutputStream和ObjectOutputStream的转换一个可串行化为一个字节[]
·发件人使用
bundle.putByteArray("Key", [ByteData]);
·碎片使用bundle.getByteArray
·破片创建MDATA与ByteArrayInputStream的和ObjectInputStream的使用字节[]

+0

因为可能mData的对象正在序列化并且它是成员对象只是被设置为旧地址,但是,将它们设置为新对象仍会更改Sender.mData上的值。这同样适用于基元,因此不仅仅是对象的问题 – Mars

1

实现Serializable接口实在是足以让一个类序列化。但是,更改碎片中mData上的任何内容都不会影响发件人类中的mData,因为它不是传递的引用。

+0

除非我在读什​​么不对,它是影响我的发件人类中的mData。对不起,没有说清楚。 – Mars

+0

如果它不是传递的引用,为什么Sender.mData和Frag.mData都@ 6945? – Mars

+0

用一些附加信息编辑问题和代码以使事情更清晰 – Mars

相关问题