首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >android应用程序中的对象反序列化问题

android应用程序中的对象反序列化问题
EN

Stack Overflow用户
提问于 2011-09-14 06:38:06
回答 1查看 822关注 0票数 0

我有一个类名ObjectSerializer。这就是:

代码语言:javascript
复制
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;
}
}

现在我已经使用控制台应用程序进行了测试,如下所示:

代码语言:javascript
复制
    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应用程序的问题是什么?

和我在android类中使用的代码

代码语言:javascript
复制
    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的报道。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-14 07:53:25

我不知道这是否原因,但:

您应该检查调试器,确认您有一个传递给serialize方法的HighScore的工作实例。如果传递null,则返回一个空字符串,然后将其添加到addScore()方法中的SharedPreferences中。如果发生这种情况,当您反序列化它时,您将得到空字符串。空字符串将创建ClassCastException。

所以我的建议是:进行更多的null检查和/或在尝试序列化null引用时停止返回空字符串,而返回“空”字符串,以便!scores.equals("empty")在这种情况下也能工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7409397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档