JSONObject的不可序列?序列、JSONObject

2023-09-06 15:28:46 作者:独饮半醉

我试图序列化一个JSONObjects ArrayList中。但我得到的错误:

 一月五日至七日:04:24.130:WARN / System.err的(913):java.io.NotSerializableException:org.json.JSONObject
1月5日至7日:04:24.130:WARN / System.err的(913):在java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1535)
1月5日至7日:04:24.130:WARN / System.err的(913):在java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1847)
1月5日至7日:04:24.130:WARN / System.err的(913):在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1689)
1月5日至7日:04:24.130:WARN / System.err的(913):在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1653)
1月5日至7日:04:24.130:WARN / System.err的(913):在java.util.ArrayList.writeObject(ArrayList.java:651)
1月5日至7日:04:24.130:WARN / System.err的(913):在java.lang.reflect.Method.invokeNative(本机方法)
1月5日至7日:04:24.130:WARN / System.err的(913):在java.lang.reflect.Method.invoke(Method.java:507)
1月5日至7日:04:24.130:WARN / System.err的(913):在java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1219)
1月5日至7日:04:24.130:WARN / System.err的(913):在java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1575)
1月5日至7日:04:24.130:WARN / System.err的(913):在java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1847)
1月5日至7日:04:24.130:WARN / System.err的(913):在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1689)
1月5日至7日:04:24.130:WARN / System.err的(913):在java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1653)
1月5日至7日:04:24.130:WARN / System.err的(913):在org.stocktwits.activity.AddStocksActivity.serializeQuotes(AddStocksActivity.java:183)
1月5日至7日:04:24.130:WARN / System.err的(913):在org.stocktwits.activity.AddStocksActivity.access $ 9(AddStocksActivity.java:178)
1月5日至7日:04:24.130:WARN / System.err的(913):在org.stocktwits.activity.AddStocksActivity $ 2.onItemClick(AddStocksActivity.java:146)
1月5日至7日:04:24.130:WARN / System.err的(913):在android.widget.AdapterView.performItemClick(AdapterView.java:284)
1月5日至7日:04:24.130:WARN / System.err的(913):在android.widget.ListView.performItemClick(ListView.java:3513)
1月5日至7日:04:24.130:WARN / System.err的(913):在android.widget.AbsListView $ PerformClick.run(AbsListView.java:1812)
1月5日至7日:04:24.130:WARN / System.err的(913):在android.os.Handler.handleCallback(Handler.java:587)
1月5日至7日:04:24.130:WARN / System.err的(913):在android.os.Handler.dispatchMessage(Handler.java:92)
1月5日至7日:04:24.130:WARN / System.err的(913):在android.os.Looper.loop(Looper.java:130)
1月5日至7日:04:24.130:WARN / System.err的(913):在android.app.ActivityThread.main(ActivityThread.java:3683)
1月5日至7日:04:24.130:WARN / System.err的(913):在java.lang.reflect.Method.invokeNative(本机方法)
1月5日至7日:04:24.130:WARN / System.err的(913):在java.lang.reflect.Method.invoke(Method.java:507)
1月5日至7日:04:24.130:WARN / System.err的(913):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)
1月5日至7日:04:24.130:WARN / System.err的(913):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
1月5日至7日:04:24.130:WARN / System.err的(913):在dalvik.system.NativeStart.main(本机方法)
 

下面是我的连载和放大器;反序列化code:

 私人无效serializeQuotes(){
        FileOutputStream中FOS;
        尝试 {
            FOS = openFileOutput(Constants.FILENAME,Context.MODE_PRIVATE);
            ObjectOutputStream的OOS =新的ObjectOutputStream(FOS);
            oos.writeObject(引号);
            oos.close();
        }赶上(FileNotFoundException异常E){
            e.printStackTrace();
        }赶上(IOException异常E){
            e.printStackTrace();
        }
    }

    @燮pressWarnings(未登记)
    私人无效deserializeQuotes(){
        尝试 {
            的FileInputStream FIS = openFileInput(Constants.FILENAME);
            ObjectInputStream的OIS =新的ObjectInputStream(FIS);
            报价=(ArrayList的<的JSONObject>)ois.readObject();
        }赶上(FileNotFoundException异常E){
            e.printStackTrace();
        }赶上(IOException异常E){
            e.printStackTrace();
        }赶上(ClassNotFoundException异常E){
            e.printStackTrace();
        }
    }
 

解决方案

老兄,这是JSON。为什么不把它序列化为JSON,而不是类型的JSONObject?

的Java对象 JSONObject解析Json

例如:

字符串myJsonObjectSerialized = myJsonObject.toString();

I am trying to serialize an ArrayList of JSONObjects. But I get the error:

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)

Here is my serialize & deserialize code:

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();
        }
    }

解决方案

Dude, it's JSON. Why not just serialize it as JSON, instead of as a Java object of type JSONObject?

For example:

String myJsonObjectSerialized = myJsonObject.toString();