我正在开发一个可在PC和Android上运行的跨平台应用。此应用程序序列化对象并将其保存到我们服务器上的文件中。我遇到的问题是当我反序列化PC上的一个对象时,我收到以下错误:
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手机(三星s5)上的对象。这完全让我感到困惑。我已将其缩小到平台问题,因为我已经直接采用编码字符串并在两台设备上解码,其中PC上弹出错误而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;
}
此外,this我使用的Base64编码器。
答案 0 :(得分:0)
您忘记将String转换为byte []以反转执行new String(Base64Coder.encode(data))
时发生的隐式byte []到String转换。
请改为尝试:
public static Object stringToObject(String encodedObject) {
try {
byte[] byteArray = encodedObject.getBytes();
ByteArrayInputStream bin = new ByteArrayInputStream(Base64Coder.decode(byteArray));
而不是:
public static Object stringToObject(String encodedObject) {
try {
ByteArrayInputStream bin = new ByteArrayInputStream(Base64Coder.decode(encodedObject));
答案 1 :(得分:0)
问题是Android高达7.0版(API 24)使用Apache Harmony Java实现,该对象序列化格式与“常规”JRE不兼容。
由于Android 7.0使用OpenJDK并且兼容。
另见: