android deserialize object?

2019-04-12 14:38发布

问题:

how to deserialize this type:

public Intent putExtra(String name, Serializable value)

example:

 intent.putExtra("activityToPass", GoToThisActivity.class);
 ???
 getIntent().getExtras.getSerializable("activityToPass");

how to do this please;

please help!!

回答1:

If you want to pass a custom object from one activity to the other, first you must have your custom object's class to implement java.io.Serializable:

public class SomeObject implements Serializable {
    private String name;
    public SomeObject (final String name) {
        this.name = name;
    }
    [...]
}

final SomeObject myExtra = new SomeObject("any name");

Then you can add this myExtra to the intent with which you call your new Activity:

final Intent intent = new Intent(this, GoToThisActivity.class);
intent.putExtra("serializedExtra", myExtra);
startActivity(intent);

Inside your GoToThisActivity class' onCreate method you can extract this extra as:

final Intent intent = getIntent();
if (intent.hasExtra("serializedExtra"))
    final SomeObject myExtra= (SomeObject)intent.
        getSerializableExtra("serializedExtra");
    [...]
}

And now you have your custom object in your new activity.

Update 1: Passing a class to an other activity with Intent
If you want to pass a Class instance to an intent:

intent.putExtra("classExtra", GoToThisActivity.class);

and to deserialize it in the other activity:

if (intent.hasExtra("classExtra"))
{
    final Class<?> classExtra= (Class<?>)intent.
        getSerializableExtra("classExtra");
    [...]
}

Update 2:
When deserializing an array of custom objects, you have to make sure, that the elements in that array implement the Serializable interface.

To stay at your sample:

public class ButtonPick implements Serializable
{
    public static final ButtonPick EDIT = new ButtonPick();
    public static final ButtonPick DELETE = new ButtonPick();
}

You put the extra in the Intent:

intent.putExtra("buttonPicks", new ButtonPick[]
    {ButtonPick.DELETE,ButtonPick.EDIT});

And inside the other activity deserialize it:

if (intent.hasExtra("buttonPicks"))
{
    final Object[] buttonPicks= (Object[])intent.
        getSerializableExtra("buttonPicks");
        [...]
}

You MUST cast the array as Object[] regardless to the original being ButtonPicks[].
The elements inside the array have their proper type, so inside are the

{ ButtonPicks.EDIT, ButtonPicks.DELETE }

members.
You need to cast them individually.