読者です 読者をやめる 読者になる 読者になる

ぴよぴよエンジニアの日記

クラウドベンダーに勤める見習いSEの日記です。発言は私自身の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

Xamarin.AndroidにおけるSerializable

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

Android Javaっぽく書く

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

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


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

Xamarin.Androidに限った話ならば前述の方法で事足りるのですが,iOSAndroidの共通クラスの場合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>(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<Item>(str);

        SetContentView(Resource.Layout.activity_my);
    }
}

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


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