Android: intent.putExtra() 更改对象?



我想将myObject传递给NewActivity类。为此,我使用了Intent中的putExtra(( 和getExtras((方法。然而,对象似乎以某种方式发生了变化?我在传递对象之前和之后都打印它。

这正常吗?我遇到了问题,因为我在HashMap中使用myObject,并且由于NewActivity中的对象本质上是一个完全不同的对象,因此我不能再将其用作键。

传递对象:

Intent myIntent = new Intent(context, NewActivity.class);
MyClass myObject = new MyClass();
myIntent.putExtra("test", myObject);
System.out.println("OBJECT BEFORE: " + myObject);

检索对象:

MyClass myObject = (MyClass) getIntent().getExtras().getSerializable("test");
System.out.println("OBJECT AFTER: " + myObject);

(不同的(打印:

I/System.out: OBJECT BEFORE: my.project.MyClass@8fe5ae4
I/System.out: OBJECT AFTER: my.project.MyClass@9f1fb7b

序列化和反序列化确实会创建新对象。

如果这对您来说是一个问题,因为您将它用作HashMap的键,则应在类中实现boolean equals(Object other)int hashCode()方法。

查看维基百科上的Java hashCode((和Oracle文档中的public int hashCode(),了解如何实现"可哈希"对象。

如果您的对象在用作键时不再依赖于标识,则应解决您的问题。

更改此设置

getIntent((.getExtras((.getSerializable((

getIntent().getSerializableExtra("test")

这就是可序列化对象的工作方式。 100%基本的Java。

它们将对象序列化为原始数据,然后当它们未序列化时,它将创建一个相同类型的全新对象,并将旧对象的所有值设置到新对象上。

所以对象引用不会相同,这也是为什么当你调用System.out.println时打印出不同的hashCode。

对象的内部值将相同。

为了将对象一个活动传递到另一个活动,您的对象类应该实现"可序列化"。

public class MyClass implements Serializable{
// 
}

传递数据

Intent myIntent = new Intent(context, NewActivity.class);
MyClass myObject = new MyClass();
myIntent.putExtra("test", myObject);

检索数据

MyClass myObject = (MyClass) getIntent().getSerializable("test");

希望这会:)

最新更新