LoginSignup
5
6

More than 5 years have passed since last update.

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

Posted at

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) {
        }
    }
}
5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6