簡體   English   中英

Android應用程序中的對象反序列化問題

[英]Object de-serialization Problem in android application

我有一個類名稱ObjectSerializer。 那是 :

public class ObjectSerializer {
public static String serialize(Serializable obj) throws IOException {
    if (obj == null)
        return "";
    ByteArrayOutputStream serialObj = new ByteArrayOutputStream();
    ObjectOutputStream objStream = new ObjectOutputStream(serialObj);
    objStream.writeObject(obj);
    objStream.close();
    return encodeBytes(serialObj.toByteArray());
}

public static Object deserialize(String str) throws IOException,
        ClassNotFoundException {
    if (str == null || str.length() == 0)
        return null;
    ByteArrayInputStream serialObj = new ByteArrayInputStream(
            decodeBytes(str));
    ObjectInputStream objStream = new ObjectInputStream(serialObj);
    return objStream.readObject();
}

public static String encodeBytes(byte[] bytes) {
    StringBuffer strBuf = new StringBuffer();

    for (int i = 0; i < bytes.length; i++) {
        strBuf.append((char) (((bytes[i] >> 4) & 0xF) + ((int) 'a')));
        strBuf.append((char) (((bytes[i]) & 0xF) + ((int) 'a')));
    }

    return strBuf.toString();
}

public static byte[] decodeBytes(String str) {
    byte[] bytes = new byte[str.length() / 2];
    for (int i = 0; i < str.length(); i += 2) {
        char c = str.charAt(i);
        bytes[i / 2] = (byte) ((c - 'a') << 4);
        c = str.charAt(i + 1);
        bytes[i / 2] += (c - 'a');
    }
    return bytes;
}
}

現在我已經使用控制台應用程序對其進行了測試,例如:

    public static void main(String[] args) throws IOException,
        ClassNotFoundException {
    HighScore highScore = new HighScore();
    highScore.setScore(10);
    highScore.setUsername("rokon");

    ArrayList<HighScore> list = new ArrayList<HighScore>();
    list.add(highScore);
    String seralized = null;
    try {
        seralized = ObjectSerializer.serialize(list);

        System.out.println(seralized);
    } catch (IOException e) {
        e.printStackTrace();
    }

    Object obj = ObjectSerializer.deserialize(seralized);
    ArrayList<HighScore> l = (ArrayList<HighScore>) obj;

    HighScore h= l.get(0);
    System.out.println(h.getUsername() + "\t" + h.getScore());
}

但同樣的事情在我的Android應用程序中不起作用。 誰能告訴我android應用中的問題是什么。

和我使用int android類的代碼

    public class HighScorePreferenceUtil {
public static String APP_SHARED_PREF = "com.wneeds.quiz";
private SharedPreferences preferences;
private final String key = "HighScore";
private Editor editor;
private ArrayList<HighScore> highScores;
private Context context;

public HighScorePreferenceUtil(Context context) {
    this.preferences = context.getSharedPreferences(APP_SHARED_PREF,
            Activity.MODE_PRIVATE);
    this.context = context;
}

public void addScore(HighScore score) {
    if (score != null) {
        try {
            this.editor = preferences.edit();
            editor.putString(key, ObjectSerializer.serialize(score));
            editor.commit();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    editor.commit();
}

public ArrayList<HighScore> getScores() {
    if (highScores == null) {
        highScores = new ArrayList<HighScore>();
    }
    try {
        String scores = preferences.getString(key, "empty");
        Object obj = ObjectSerializer.deserialize(scores);

        if (!scores.equals("empty")) {
            ArrayList<HighScore> list = (ArrayList<HighScore>) obj;
            highScores = list;
        }

    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

    return highScores;
}
}

我正在收到ClassCastException。 Herte是logCat報告。

09-13 22:29:27.083: ERROR/AndroidRuntime(983): FATAL EXCEPTION: main
09-13 22:29:27.083: ERROR/AndroidRuntime(983): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.rokon/com.rokon.SharedPreferenceDemoActivity}: java.lang.ClassCastException: com.rokon.HighScore
09-13 22:29:27.083: ERROR/AndroidRuntime(983):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
09-13 22:29:27.083: ERROR/AndroidRuntime(983):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
09-13 22:29:27.083: ERROR/AndroidRuntime(983):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
09-13 22:29:27.083: ERROR/AndroidRuntime(983):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
09-13 22:29:27.083: ERROR/AndroidRuntime(983):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-13 22:29:27.083: ERROR/AndroidRuntime(983):     at android.os.Looper.loop(Looper.java:123)
09-13 22:29:27.083: ERROR/AndroidRuntime(983):     at android.app.ActivityThread.main(ActivityThread.java:4627)
09-13 22:29:27.083: ERROR/AndroidRuntime(983):     at java.lang.reflect.Method.invokeNative(Native Method)
09-13 22:29:27.083: ERROR/AndroidRuntime(983):     at java.lang.reflect.Method.invoke(Method.java:521)
09-13 22:29:27.083: ERROR/AndroidRuntime(983):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-13 22:29:27.083: ERROR/AndroidRuntime(983):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-13 22:29:27.083: ERROR/AndroidRuntime(983):     at dalvik.system.NativeStart.main(Native Method)
09-13 22:29:27.083: ERROR/AndroidRuntime(983): Caused by: java.lang.ClassCastException: com.rokon.HighScore
09-13 22:29:27.083: ERROR/AndroidRuntime(983):     at com.rokon.HighScorePreferenceUtil.getScores(HighScorePreferenceUtil.java:51)
09-13 22:29:27.083: ERROR/AndroidRuntime(983):     at com.rokon.SharedPreferenceDemoActivity.onCreate(SharedPreferenceDemoActivity.java:54)
09-13 22:29:27.083: ERROR/AndroidRuntime(983):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
09-13 22:29:27.083: ERROR/AndroidRuntime(983):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627
09-13 22:29:27.083: ERROR/AndroidRuntime(983):     ... 11 more

我不確定這是否是原因,但:

您應該與調試器一起檢查是否有傳遞給序列化方法的HighScore工作實例。 如果傳遞null,則返回一個空字符串,然后將其添加到addScore()方法中的SharedPreferences中。 如果發生這種情況,則反序列化時將返回空字符串。 空字符串將創建ClassCastException。

因此,我的建議是:在嘗試序列化空引用並返回“空”字符串時,請執行更多的空檢查和/或停止返回空字符串,以便在這種情況下!scores.equals("empty")可以正常工作,太。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM