Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
6
Help us understand the problem. What is going on with this article?
@ueno-yuhei

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

More than 3 years have 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) {
        }
    }
}
6
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ueno-yuhei
水樹奈々が好き!

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
6
Help us understand the problem. What is going on with this article?