JSONObjectsのArrayListをシリアル化しようとしています。しかし、エラーが発生します:
05-07 01:04:24.130: WARN/System.err(913): Java.io.NotSerializableException: org.json.JSONObject
05-07 01:04:24.130: WARN/System.err(913): at Java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.Java:1535)
05-07 01:04:24.130: WARN/System.err(913): at Java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.Java:1847)
05-07 01:04:24.130: WARN/System.err(913): at Java.io.ObjectOutputStream.writeObject(ObjectOutputStream.Java:1689)
05-07 01:04:24.130: WARN/System.err(913): at Java.io.ObjectOutputStream.writeObject(ObjectOutputStream.Java:1653)
05-07 01:04:24.130: WARN/System.err(913): at Java.util.ArrayList.writeObject(ArrayList.Java:651)
05-07 01:04:24.130: WARN/System.err(913): at Java.lang.reflect.Method.invokeNative(Native Method)
05-07 01:04:24.130: WARN/System.err(913): at Java.lang.reflect.Method.invoke(Method.Java:507)
05-07 01:04:24.130: WARN/System.err(913): at Java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.Java:1219)
05-07 01:04:24.130: WARN/System.err(913): at Java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.Java:1575)
05-07 01:04:24.130: WARN/System.err(913): at Java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.Java:1847)
05-07 01:04:24.130: WARN/System.err(913): at Java.io.ObjectOutputStream.writeObject(ObjectOutputStream.Java:1689)
05-07 01:04:24.130: WARN/System.err(913): at Java.io.ObjectOutputStream.writeObject(ObjectOutputStream.Java:1653)
05-07 01:04:24.130: WARN/System.err(913): at org.stocktwits.activity.AddStocksActivity.serializeQuotes(AddStocksActivity.Java:183)
05-07 01:04:24.130: WARN/System.err(913): at org.stocktwits.activity.AddStocksActivity.access$9(AddStocksActivity.Java:178)
05-07 01:04:24.130: WARN/System.err(913): at org.stocktwits.activity.AddStocksActivity$2.onItemClick(AddStocksActivity.Java:146)
05-07 01:04:24.130: WARN/System.err(913): at Android.widget.AdapterView.performItemClick(AdapterView.Java:284)
05-07 01:04:24.130: WARN/System.err(913): at Android.widget.ListView.performItemClick(ListView.Java:3513)
05-07 01:04:24.130: WARN/System.err(913): at Android.widget.AbsListView$PerformClick.run(AbsListView.Java:1812)
05-07 01:04:24.130: WARN/System.err(913): at Android.os.Handler.handleCallback(Handler.Java:587)
05-07 01:04:24.130: WARN/System.err(913): at Android.os.Handler.dispatchMessage(Handler.Java:92)
05-07 01:04:24.130: WARN/System.err(913): at Android.os.Looper.loop(Looper.Java:130)
05-07 01:04:24.130: WARN/System.err(913): at Android.app.ActivityThread.main(ActivityThread.Java:3683)
05-07 01:04:24.130: WARN/System.err(913): at Java.lang.reflect.Method.invokeNative(Native Method)
05-07 01:04:24.130: WARN/System.err(913): at Java.lang.reflect.Method.invoke(Method.Java:507)
05-07 01:04:24.130: WARN/System.err(913): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:839)
05-07 01:04:24.130: WARN/System.err(913): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:597)
05-07 01:04:24.130: WARN/System.err(913): at dalvik.system.NativeStart.main(Native Method)
これが私のシリアル化と逆シリアル化のコードです:
private void serializeQuotes() {
FileOutputStream fos;
try {
fos = openFileOutput(Constants.FILENAME, Context.MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(quotes);
oos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
private void deserializeQuotes() {
try {
FileInputStream fis = openFileInput(Constants.FILENAME);
ObjectInputStream ois = new ObjectInputStream(fis);
quotes = (ArrayList<JSONObject>) ois.readObject();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
おい、それはJSONです。 JSONObject型のJavaオブジェクトとしてではなく、JSONとしてシリアル化しないのはなぜですか?
例えば:
String myJsonObjectSerialized = myJsonObject.toString();
JSONオブジェクトを文字列表記にマーシャリングすることなく、Java組み込みのシリアル化が必要な場合は、org.jsonからJSONObjectとJSONArrayを拡張してください。 Serializableを実装するだけです。
次に、オリジナルの代わりに、JSONObjectとJSONArrayの独自のバージョンを全面的に使用できます。
サブクラスですべてのコンストラクターを定義し、対応するsuper()を呼び出すだけでなく、プロパティからgetJSONObject()やgetJSONArray()などの親型を返す特定のメソッドを実装するようにしてください。
Serializableオブジェクトクラス内にJSONArrayがある場合は、この方法でJSONArrayを初期化してみてください。
プライベートトランジェントJSONArray jsonArray;
public class Person implements Serializable {
private String name;
private transient JSONArray jsonArray;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public JSONArray getJsonArray() {
return jsonArray;
}
public void setJsonArray(JSONArray jsonArray) {
this.jsonArray = jsonArray;
}
}
もう1つの方法は、org.json
ライブラリをjson-simple
と交換することです。
json-simple
のJSONObject
クラスはHashMap
を拡張します。これは、Javaシリアライズ可能であり、Java風のAPIです。
http://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple/1.1.1
https://www.mkyong.com/Java/json-simple-example-read-and-write-json/