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

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

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

### List → ArrayList
```java
List<Instance> list;
// ↓
ArrayList<Instance> list;
```

### Map → HashMap
```java
Map<String, String> map;
// ↓
HashMap<String, String> map;
```

MapとListは、Serializeできません。
MapはHasMapへ
ListはArrayListにします。
HashMapはMapをArrayListはListを継承しているので、同じ使い勝手で使えると思います。


### JSONObject
```java
// jsonの元の文字列を保持しておいて、受け取り先のActivity,Fragmentで再生成
JSONObject json = new JSONObject("jsonString");
```

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

JSONObejctとJsonObject(Gson)をそのまま渡すというのも変な話ですが、
渡した先のFramgne,Activityで、リクエストパラーメータを渡ってきたJSONをそのまま使う　というのがあり使ってみました。

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

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

### Uri
```java
Uri uri = Uri.parse("URL");
```

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

## 変数はtransientとして定義する

```java
public String jsonString;
public transient JsonObject json;
public String uriString;
public transient Uri uri;
```

のような感じで、Serializeble出来無い型は、transientをつけて定義します。
こうすることで、Serializeの対象から外され落ちことはありません。

## 再生成のメソッドを定義する
```java
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) {
        }
    }
}
```