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クラスになる
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) {
}
}
}