Posted at

Serialize出来ない型への対応を考える!

More than 1 year has passed since last update.


Serialize出来ない型

Activityだとintent、FragmentだとBundleに対して、渡したいデータやデータが詰まったmodelのインスタンスなどを渡す というのは結構あると思います。

今回シリアライズ対応してい無い型の時に、他のClassを使い、こうやれば同じデータを送れて使い勝手もほぼ変わらで対応できるんじゃないか? ということをまとめてみました。


List → ArrayList

List<Instance> list;

// ↓
ArrayList<Instance> list;


Map → HashMap

Map<String, String> map;

// ↓
HashMap<String, String> map;

MapとListは、Serializeできません。

MapはHasMapへ

ListはArrayListにします。

HashMapはMapをArrayListはListを継承しているので、同じ使い勝手で使えると思います。


JSONObject

// jsonの元の文字列を保持しておいて、受け取り先のActivity,Fragmentで再生成

JSONObject json = new JSONObject("jsonString");


JsonObject(Gson)

JsonObject json = new Gson().fromJson("jsonString", JsonObject.class);

JSONObejctとJsonObject(Gson)をそのまま渡すというのも変な話ですが、

渡した先のFramgne,Activityで、リクエストパラーメータを渡ってきたJSONをそのまま使う というのがあり使ってみました。


Date

try {

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
date = dateFormat.parse(dateString);
} catch(ParseException e) {
}

時間同士の計算や表示すべきかそうでないか を判定する時によく使うDate型


Uri

Uri uri = Uri.parse("URL");

URLを扱いしやすくするためのUri型


変数はtransientとして定義する

public String jsonString;

public transient JsonObject json;
public String uriString;
public transient Uri uri;

のような感じで、Serializeble出来無い型は、transientをつけて定義します。

こうすることで、Serializeの対象から外され落ちことはありません。


再生成のメソッドを定義する

public void generate() {

JsonObject json = new Gson().fromJson(jsonString, JsonObject.class);
uri = Uri.parse(uriString);
}

publicなメソッドを一つ用意して、Serializeして渡ってきた文字などを使い、trasientで定義したおいた変数に入れます。

こうすると、前画面のActivityやFragment側で同じように値を使えます。便利便利!


こんな感じのModelクラスになる


java:SampleModel.java

import android.net.Uri;

import com.google.gson.Gson;
import com.google.gson.JsonObject;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;

public class SampleModel implements Serializable {
private static final long serialVersionUID = 4226701820259487692L;

// public Map map;
public HashMap map;

// public List list;
public ArrayList list;

public transient Date date;
public String dateString;

public transient Uri uri;
public String uriString;

public transient JSONObject jsonObject;
public String jsonObjectString;

public transient JsonObject gsonObject;
public String gsonObjectString;

public SampleModel(JSONObject json) throws JSONException {
dateString = json.getString("date");
uriString = json.getString("uri");
jsonObjectString = json.getJSONObject("json_object").toString();
gsonObjectString = json.getJSONObject("json_object").toString();
generate();
}

// Activityなどに渡した後に、このメソッドを呼ぶ
public void generate() throws JSONException {
try {
// Date
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
date = dateFormat.parse(dateString);
// Uri
uri = Uri.parse(uriString);
// jsoo
jsonObject = new JSONObject(jsonObjectString);
// gson
gsonObject = new Gson().fromJson(gsonObjectString, JsonObject.class);
} catch (ParseException e) {
}
}
}