Android: intent.putExtra () меняет объекты? - PullRequest
0 голосов
/ 05 июля 2018

Я хочу передать myObject в класс NewActivity . Для этого я использую методы putExtra () и getExtras () из Intent . Оказывается, однако, что объект меняется как-то? Я печатаю объект до и после его передачи.

Это нормально? Я сталкиваюсь с проблемами, потому что я использую myObject в HashMap, и поскольку объект в 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

Ответы [ 4 ]

0 голосов
/ 06 июля 2018

Сериализация и десериализация создает новые объекты.

Если это проблема для вас, потому что вы используете его в качестве ключа в HashMap, вы должны реализовать методы boolean equals(Object other) и int hashCode() в своем классе.

Изучите Java hashCode () в Википедии и public int hashCode() в документации Oracle, чтобы узнать, как реализовать «хешируемый» объект.

Если ваш объект больше не зависит от идентичности при использовании в качестве ключа, ваша проблема должна быть решена.

0 голосов
/ 05 июля 2018

Так работают сериализуемые объекты. 100% базовая Java.

Они сериализуют объекты в необработанные данные, а затем, когда они не сериализуются, он создаст совершенно новый объект того же типа и установит все значения, которые старый объект имел для нового.

Таким образом, ссылки на объекты не будут одинаковыми, и поэтому при вызове System.out.println.

печатается другой хэш-код.

Внутренние значения объекта будут одинаковыми.

0 голосов
/ 05 июля 2018

Для передачи объекта одного действия другому, Ваш объектный класс должен реализовать "Сериализуемый".

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");

Надеюсь, это сработает:)

0 голосов
/ 05 июля 2018

изменить это

getIntent (). GetExtras (). GetSerializable ()

до

getIntent().getSerializableExtra("test")
...