ฉันกำลังพัฒนาแอปข้ามแพลตฟอร์มที่ทำงานทั้งบนพีซีและ Android แอปนี้ทำให้ออบเจ็กต์เป็นอนุกรมและบันทึกลงในไฟล์บนเซิร์ฟเวอร์ของเรา ปัญหาที่ฉันพบคือเมื่อฉันดีซีเรียลไลซ์ออบเจ็กต์ใดวัตถุหนึ่งบนพีซี ฉันได้รับข้อผิดพลาดต่อไปนี้:
java.io.StreamCorruptedException: invalid type code: 71
at java.io.ObjectInputStream.readString(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readEnum(ObjectInputStream.java:1736)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1706)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1344)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
อย่างไรก็ตาม ฉันสามารถดีซีเรียลไลซ์วัตถุบนโทรศัพท์ Android (Samsung s5) ได้สำเร็จ สิ่งนี้ทำให้ฉันงุนงงอย่างสมบูรณ์ ฉันได้จำกัดปัญหาให้แคบลงจนถึงปัญหาแพลตฟอร์ม เนื่องจากฉันได้นำสตริงที่เข้ารหัสโดยตรงและถอดรหัสบนอุปกรณ์ทั้งสองเครื่อง ซึ่งมีข้อผิดพลาดปรากฏขึ้นบนพีซี ไม่ใช่บนอุปกรณ์ Android สิ่งนี้บอกฉันว่าสตริงที่เข้ารหัสไม่ได้เสียหายจริงๆ ฉันพลาดอะไรไปรึเปล่า? ข้อเสนอแนะใด ๆ ที่จะได้รับการชื่นชม
นี่คือรหัสที่ฉันใช้เพื่อทำให้วัตถุเป็นอนุกรม:
public static String objectToString(Serializable object) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
ObjectOutputStream obj = new ObjectOutputStream(out);
obj.writeObject(object);
byte[] data = out.toByteArray();
obj.close();
out.close();
return new String(Base64Coder.encode(data));
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static Object stringToObject(String encodedObject) {
try {
ByteArrayInputStream bin = new ByteArrayInputStream(Base64Coder.decode(encodedObject));
ObjectInputStream input = new ObjectInputStream(bin);
try{
return input.readObject();
}finally{
Gdx.app.log(TAG, "Input closed!");
input.close();
bin.close();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
นอกจากนี้ นี่คือตัวเข้ารหัส Base64 I ใช้.