JSONObject不可序列化?

我正在尝试序列化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(); } } 

Solutions Collecting From Web of "JSONObject不可序列化?"

伙计,这是JSON。 为什么不把它序列化为JSON,而不是作为JSONObjecttypes的Java对象呢?

例如:

String myJsonObjectSerialized = myJsonObject.toString();

在这种情况下,您仍然希望使用Java内置序列化,而不必使用string表示法将您的JSON对象封装起来,您可以做的一件事就是扩展来自org.json的JSONObject和JSONArray,并实现Serializable。

然后,您可以使用您自己的版本的JSONObject和JSONArray,而不是原件。

确保在你的子类中定义了所有的构造函数,并调用它们的super()对象,并实现从属性返回父types的特定方法,如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; } } 

另一种方法是用json-simple交换org.json库。

json-simpleJSONObject类扩展了Java Serializable的HashMap以及更多的java-ish API。

Maven依赖:

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/