我有一个类名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应用程序的问题是什么?
和我在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发布于 2011-09-14 07:53:25
我不知道这是否原因,但:
您应该检查调试器,确认您有一个传递给serialize方法的HighScore的工作实例。如果传递null,则返回一个空字符串,然后将其添加到addScore()方法中的SharedPreferences中。如果发生这种情况,当您反序列化它时,您将得到空字符串。空字符串将创建ClassCastException。
所以我的建议是:进行更多的null检查和/或在尝试序列化null引用时停止返回空字符串,而返回“空”字符串,以便!scores.equals("empty")在这种情况下也能工作。
https://stackoverflow.com/questions/7409397
复制相似问题