【问题标题】:Reference is changing after object is serialized?对象序列化后引用发生变化?
【发布时间】:2020-07-20 12:50:47
【问题描述】:

所以我的Fragment 中有这段代码:

ProductParams params = (ProductParams) getArguments().getSerializable("product_params");
Log.i("TAG", "setupFragment: "+params.getChampionId());
params.setChampionId(100);
params = (ProductParams) getArguments().getSerializable("product_params");
Log.i("TAG", "setupFragment: "+params.getChampionId());

params.getChampionId() 第一个日志的值为 0。但令人惊讶的是,第二个日志的值为 100,而我希望它为 0(初始值)。为什么会这样?我怎样才能让getArguments().getSerializable("product_params") 返回初始值?

【问题讨论】:

  • 第二个Log 返回您作为参数发送的初始数据。即,两者 Log 是相同的。请指定您要做什么...
  • @Vishnu 我的问题令人困惑。我编辑了我的问题。谢谢。
  • 您在params.setChampionId(100); 中将值设置为100
  • 好的。但话又说回来,我将params 引用到来自参数的序列化对象。这是否意味着当我更改params对象的字段时,实际上我正在更改序列化对象?

标签: java android serialization


【解决方案1】:

Bundle 类缓存 反序列化对象,这意味着getSerializable 每次都会返回对同一个对象的引用。如果您更改该对象中的某个字段,您将通过每个引用看到该更改。

因此,将可变对象作为参数传递到包中或以其他方式传递并不是一个好主意。如果没有ProductParams.setChampionId,就不会出现这个问题。

【讨论】:

  • 那是我不知道的。谢谢。所以Android向Fragment传递数据的标准方式是使用Bundle。还有什么方法更方便? @乔尼
  • 视情况而定。参数包对于片段不修改的数据很方便,因为它通过活动生命周期事件持续存在
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多