Xamarin.Android における Serializable

Android Java での Serializable を Xamarin.Android ではどう実装するのかについてです.

Android Java っぽく書く

Java.IO.ISerializable を継承することで Android Java のように書けるようです.
詳しくは以下をご参照ください.

同様にParcelableを用いる方法はこちらです.

共通クラスのオブジェクトを Serialize

Xamarin.Android に限った話ならば前述の方法で事足りるのですが,iOS,Android の共通クラスの場合 ISerializable や Parcelable を継承できないので別の方法が必要になります.

そこでオブジェクトを String に Serialize して,受け取り側で元のクラスにDeserializeするという少々泥臭い方法を取ります.

Serialize と Deserialize を行うライブラリには ServiceStack.Text を用いました.

public class MyActivity : AppCompatActivity
{
    public static void Start(Activity activity, Item item)
    {
        var intent = new Intent(activity, typeof(MyActivity));
            
        var bundle = new Bundle();
        bundle.PutString("item", JsonSerializer.SerializeToString(item));

        intent.PutExtras(bundle);

        activity.StartActivity(intent);
    }
}

呼び出し側の Activity がコールするメソッドです.
JsonSerializer#SerializeToString を用いてカスタムクラスのオブジェクトを String に Serialize しています.

public class MyActivity : AppCompatActivity
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        var str = this.Intent.Extras.GetString("item");
        this.Item= JsonSerializer.DeserializeFromString(str);

        SetContentView(Resource.Layout.activity_my);
    }
}

受け取り側の Activity の OnCreate です.
JsonSerializer#DeserializeFromString を用いて String からカスタムクラスのオブジェクトに Deserialize しています.

少々泥臭いですが,この方法を用いれば ISerializable や Parcelable を継承せずとも安全にオブジェクトを渡すことができます.