![](/img/trans.png)
[英]Android Bundle vs Java plain object (POJO) - serialization/de-serialization performance
[英]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.